AVL树
2018-03-07 12:41
190 查看
AVL树基本操作
/* 定义结点 */ struct node { int v, h; // 值,高度 node *lchild, *rchild; }; /* 新建结点 */ node* newNode(int x) { node* root = new node; root->v = x; root->h = 1; // 新结点高度为1 root->lchild = root->rchild = NULL; return root; } /* 获取结点高度 */ int getHeight(node* root) { if (root == NULL) // 空结点高度为0 return 0; return root->h; } /* 更新结点高度 */ void updateHeight(node* root) { root->h = max(getHeight(root->lchild), getHeight(root->rchild)) + 1; // 根结点高度为子结点最大高度+1 } /* 计算平衡因子 */ int getBalanceFactor(node* root) { return getHeight(root->lchild) - getHeight(root->rchild); } /* 左旋 */ void L(node* &root) { node* temp = root->rchild; root->rchild = temp->lchild; temp->lchild = root; updateHeight(root); updateHeight(temp); root = temp; } /* 右旋 */ void R(node* &root) { node* temp = root->lchild; root->lchild = temp->rchild; temp->rchild = root; updateHeight(root); updateHeight(temp); root = temp; } /* 结点插入 */ void insert(node* &root, int x) { if (root == NULL) // 找到插入位置 { root = newNode(x); return; } if (x > root->v) // 向右子树插入 { insert(root->rchild, x); updateHeight(root); // 插入后更新结点高度 if (getHeight(root) == -2) if (getHeight(root->rchild) == -1) // RR情况 L(root); else if (getHeight(root->rchild) == 1) // RL情况 { R(root->rchild); L(root); } } else // 向左子树插入 { insert(root->lchild, x); updateHeight(root); // 插入后更新结点高度 if (getHeight(root) == 2) if (getHeight(root->lchild) == 1) // LL情况 R(root); else if (getHeight(root->lchild) == -1) // LR情况 { L(root->lchild); R(root); } } } /* 创建AVL树 */ node* create(int data[], int n) { node* root = NULL; for (int i = 0; i < n; i++) insert(root, data[i]); return root; }