🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 平衡二叉树 ## 定义 左右子树的高度差称为该节点的平衡因子,每个节点的平衡因子都不超过1的二叉树称为平衡二叉树(AVL),其高度能始终保持 O(logn) 级别。 ### 数据结构 ```C++ // 节点数据结构 struct node{ int data,height; node *lchild, *rchild; }; ``` ```C++ // 新建节点 node* newNode(int v){ node* Node=new node; Node->data=v; Node->height=1; Node->lchild=Node->rchild=NULL; return Node; } ``` ```C++ // 获取当前节点高度 int getHeight(node* root){ if(root==NULL) return 0; return root.height; } ``` ```C++ // 计算当前节点的平衡因子 int getBalanceFactor(node* root){ return getHeight(root->lchild)-getHeight(root->rchild); } ``` ```C++ // 更新当前节点的 height void updateHeight(node* root){ root->height=max(root->lchild->height, root->rchild->height)+1; } ``` ## 基本操作 ### 查找元素 ```C++ void search(node* root, int x){ if(root==NULL){ printf("search failed\n"); return; } if(x==root->data) printf("%d\n",root->data); else if(x<root->data) search(root->lchild,x); else search(root->rchild,x); } ``` ### 插入元素 ```C++ // 左旋 void L(node* &root){ node* tmp=root->rchild; root->rchild=tmp->lchild; tmp->lchild=root; updateHeight(root); updateHeight(tmp); root=tmp; } ``` ```C++ // 右旋 void R(node* &root){ node* tmp=root->lchild; root->lchild=tmp->rchild; tmp->rchild=root; updateHeight(root); updateHeight(tmp); root=tmp; } ``` | 树形 | 判定条件 | 调整方法 | | :--: | :-----------------------------: | :---------------------: | | LL | BF(root)=2,BF(root->lchild)=1 | R(root) | | LR | BF(root)=2,BF(root->lchild)=-1 | L(root->lchild),R(root) | | RR | BF(root)=-2,BF(root->rchild)=-1 | L(root) | | RL | BF(root)=-2,BF(root->rchild)=1 | R(root->rchild),L(root) | ```C++ // 插入元素 void insert(node* &root, int v){ if(root==NULL){ root=newNode(v); return; } if(v<root->data){ insert(root->lchild,v); updateHeight(root); if(getBalanceFactor(root)==2){ if(getBalanceFactor(root->lchild)==1) R(root); else if(getBalanceFactor(root->lchild==-1)){ L(root->lchild); R(root); } } } else{ insert(root->rchild,v); updateHeight(root); if(getBalanceFactor(root)==-2){ if(getBalanceFactor(root->rchild)==-1) L(root); else if(getBalanceFactoe(root->rchild)==1){ R(root->rchild); L(root); } } } } ``` ### AVL 建立 ```C++ node* Create(int data[], int n){ node* root=NULL; for(int i=0;i<n;i++){ insert(root,data[i]); } return root; } ```