建立维持平衡二叉树(Root of AVL Tree)

Root of AVL Tree

  • 原题链接
  • 解题思路
  • 源代码

原题链接

树(中)课后练习题2,也是PAT 甲级 1066

解题思路

根据输入结点建立一个AVL树,输出树根即可。这个何老师将的旋转类型是根据“麻烦结点”相对于“破坏节点”的位置来定义的,我这里实现方式是参考算法笔记中的,R就表示右旋,L表示左旋,是根据旋转的方向取得名字。贴一下图,感觉很好理解。
建立维持平衡二叉树(Root of AVL Tree)_第1张图片
建立维持平衡二叉树(Root of AVL Tree)_第2张图片
建立维持平衡二叉树(Root of AVL Tree)_第3张图片

源代码

建树过程和建立一棵BST比较类似,建立AVL树要在插入过程中附带上失衡的检查和处理,一旦发现插入导致失衡,就通过表9-1的旋转情况将树调整为平衡情况,最后返回树根即可。

#include
using namespace std;
const int maxn=23;
struct node
{
    int data,height;
    node* lchild;
    node* rchild;
};
node* root;//根节点
//生成一个新结点,data为结点权值
node* newNode(int data)
{
    node* root=new node;
    root->data=data;
    root->height=1;
    root->lchild=root->rchild=NULL;
    return root;
}
//获取以root为根结点的子树的当前height
int getHeight(node* root)
{
    if(root==NULL)//空结点高度为0
        return 0;
    return root->height;
}
//更新结点root的height
void updateHeight(node* root)
{
    root->height=max(getHeight(root->lchild),getHeight(root->rchild))+1;
}
//计算结点root的平衡因子
int getBalanceFactor(node* root)
{
    int factor=getHeight(root->lchild)-getHeight(root->rchild);
    return factor;
}
//Left Rotation
void L(node* &root)
{
    node* temp=root->rchild;
    root->rchild=temp->lchild;
    temp->lchild=root;
    updateHeight(root);
    updateHeight(temp);
    root=temp;
}
//Right Rotation
void R(node* &root)
{
    node* temp=root->lchild;
    root->lchild=temp->rchild;
    temp->rchild=root;
    updateHeight(root);
    updateHeight(temp);
    root=temp;
}
//插入权值为data的结点
void insertNode(node* &root,int data)
{
    if(root==NULL)
    {
        root=newNode(data);
        return ;
    }
    if(data < root->data)
    {
        insertNode(root->lchild,data);
        updateHeight(root);
        if(getBalanceFactor(root)==2)
        {
            if(getBalanceFactor(root->lchild)==1)//LL型
            {
                R(root);
            }
            else if(getBalanceFactor(root->lchild)==-1)//LR型
            {
                L(root->lchild);
                R(root);
            }
        }
    }
    else
    {
        insertNode(root->rchild,data);
        updateHeight(root);
        if(getBalanceFactor(root)==-2)
        {
            if(getBalanceFactor(root->rchild)==-1)//RR型
            {
                L(root);
            }
            else if(getBalanceFactor(root->rchild)==1)//RL型
            {
                R(root->rchild);
                L(root);
            }
        }
    }
}
//AVL树的建立
node* create(int data[], int n)
{
    node* root=NULL;
    for(int i=0; i<n; i++)
    {
        insertNode(root,data[i]);
    }
    return root;
}
int main()
{
    int data[maxn];
    int n;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        scanf("%d",&data[i]);
    }
    root=create(data,n);
    printf("%d\n",root->data);
    return 0;
}

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