平衡二叉树

数据结构实验之查找二:平衡二叉树

Time Limit: 400 ms Memory Limit: 65536 KiB

Problem Description

根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。

Input

输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。

Output

输出平衡二叉树的树根。

Sample Input

5
88 70 61 96 120

Sample Output

70

#include <bits/stdc++.h>
using namespace std;
struct node
{
   
    int data;
    int h;
    struct node *l, *r;
};
struct node *LL(struct node *tree);
struct node *RR(struct node *tree);
struct node *LR(struct node *tree);
struct node *RL(struct node *tree);
int geth(struct node *tree);
struct node *insert_tree(int x, struct node *tree);
int main()        //——————————————————————————主函数起始
{
   
    int n, a;
    cin>>n;
    struct node *root =NULL;
    for(int i=0; i<n; i++)
    {
   
        cin>>a;
        root=insert_tree(a, root);//调用插入函数
    }
    cout<<root->data<<endl;
    return 0;
}                  //——————————————————————————主函数结束
struct node *LL(struct node *tree)
{
   
    struct node *p=tree->l;
    tree->l=p->r;
    p->r=tree;
    p->h=max(geth(p->l), tree->h)+1;
    tree->h=max(geth(tree->l), geth(tree->r))+1;
    return p;
}
struct node *RR(struct node *tree)
{
   
    struct node *p=tree->r;
    tree->r=p->l;
    p->l=tree;
    p->h=max(geth(p->l), tree->h)+1;
    tree->h=max(geth(tree->l), geth(tree->r))+1;
    return p;
}
struct node *LR(struct node *tree)
{
   
    tree->l=RR(tree->l);
    tree=LL(tree);
    return tree;
}
struct node *RL(struct node *tree)
{
   
    tree->r=LL(tree->r);
    tree=RR(tree);
    return tree;
}
int geth(struct node *tree)
{
   
    if(tree==NULL)
    {
   
        return -1;
    }
    else
        return tree->h;
}
struct node *insert_tree(int x, struct node *tree)//插入,建树
{
   
    if(tree==NULL)//如果根节点为空,直接存入数据
    {
   
        tree=new node;
        tree->data=x;
        tree->l=tree->r=NULL;
        tree->h=0;
    }
    else if(x>tree->data)//如果目标数据大,插入到根节点的右边
    {
   
        tree->r=insert_tree(x, tree->r);//递归调用插入函数
        if(geth(tree->r)-geth(tree->l)>1)//在插入结束后判断左右孩子的高度,如果失衡(高度差为大于1的数字),则需要进行旋转
        {
   
            if(x>tree->r->data)//首先,肯定是“R”开头的类型,如果根节点的右孩子的值小于目标数据,那么一定是插入了右孩子的右边,为RR类型
            {
   
                tree=RR(tree);
            }
            else//否则就是左边,为RL类型
                tree=RL(tree);
        }
    }
    else if(x<tree->data)
    {
   
        tree->l=insert_tree(x, tree->l);
        if(geth(tree->l)-geth(tree->r)>1)
        {
   
            if(x>tree->l->data)
            {
   
                tree=LR(tree);//比左孩子的数据大,为LR
            }
            else
                tree=LL(tree);//否则为LL
        }
    }
    tree->h=max(geth(tree->l), geth(tree->r))+1;//最后记得取一下根节点的高度
    return tree;
}

全部评论

相关推荐

明天不下雨了:兄弟你是我今天看到的最好看的简历(我说的是简历风格跟简历书写)把985 211再搞亮一点。投boss就说;您好,我华科(985)研二在读,本科211。对您的岗位很感兴趣,希望能获得一次投递机会。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务