平衡二叉树(AVL树)
左右子树高度之差的绝对值不超过1,左右子树高度之差称为该结点的平衡因子。
引入目的:使每次查询操作是o(logn)的时间复杂度
通过对树的结构进行调整,使树的高度在每次插入结束后仍能保持o(logn)的级别。
引入变量height来记录高度
struct node{
int v,height; //结点权值和当前子树的高度
node *lchild,*rchild;//左右孩子结点地址
};
新建一个结点
1.申请变量空间 2 初始结点权值,高度(1) 3 初始左右孩子为空 4 返回新建这个节点的地址
node *newNode(int v){
node* Node = new node;//申请一个Node型变量的地址空间
Node->v = v;//结点权值为v
Node->height =1;//结点高度初始为1
Node->lchild = Node->rchild = NULL;//结点初始没有左右孩子
return Node;//返回新建结点的地址
}
获取当前结点所在子树的高度
int getHeight(node* root){
if(root==NULL) return 0; //考虑为空的情况,空节点高度为0
return root->height;
}
更新height
int updateHeight(node *root){
//结点的高度等于左右子树中的最大高度加1
root->height = max(getHeight(root->lchild),getHeight(root->rchild))+1;
}
计算平衡因子
int getBalanceFactor(node* root){
//左子树减右子树
return getHeight(root->lchild)-getHeight(root->rchild);
}