数据结构专题二:二叉树_3

平衡二叉树AVL树是一棵二叉查找树,对AVL树的任意结点来说,其左子树和右子树的高度差的绝对值不超过1.数据结构专题二:二叉树_3_第1张图片

 其中左右子树的高度之差称为该结点的平衡因子;

struct node{
    int v,height;//v为结点的权值,height为结点的高度
    node * lchild, *rchild;    
}

//创建一个节点,权值为v
node * NewNode(int v){
    node * Node = new node;
    Node->v = v;
    Node->height = 1; //节点高度初始为1
    Node->lchild=Node->rchild=NULL;
    return Node;     

}

//获取节点高度
int getHeight(node * root){
    if(root == NULL){
    return 0;
}
    return root->height;

}

//计算节点的平衡因子
int getBalanceFactor(node * root)
{
    return getHeight(root->lchild) - getHight(root->rchild);
}


//更新节点高度
void updateHeight(node * root){
    root->Height =max(getHeight(root->lchild),getHeight(root->rchild))+1;
}

查找操作和二叉查找树相同

void search(node*root,int x){
    if(root ==NULL){
        return;
    }
    if(x==root->v){
        printf("%d\n",root->v);
    }else if(xv){  //如果x比根结点的数据域小,说明在左子树
        search(root->lchild,x);    //往左子树搜索
    }else{      //x比根结点的数据域大,说明在右子树
        search(root->rchild,x);    //往右子树搜索
    }
}

比较麻烦的是插入操作,记录完成插入操作后,剩下的篇目里就带着记录一点点算法。贪多嚼不烂,够用就好。

左旋: 需要满足A比B小但是,并且A比B的lchild的数据也小,这样A取代原先B的lchild的位置,B原来的lchild变成A的rchild数据结构专题二:二叉树_3_第2张图片

void L(node * &root)
{
    node * temp =root->rchild;
    root->rchild = temp->lchild;
    temp->lchild = root;
    updateHeight(root); //更新节点A的高度
    updateHeight(temp); //更新节点B的高度
    root = temp;
}

右旋 :B大于A的rchild,并且B大于A,B取代A的rchild位置,原先A的rchild成为B的lchild

 数据结构专题二:二叉树_3_第3张图片

void R(node * & root){
    node * temp = root->lchild ;
    root->lchild = temp=>rchild ;
    temp->rchild = root;
    updateHeight(root);
    updateHeight(temp);
    root = temp;
}

 

 

你可能感兴趣的:(数据结构篇)