微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

平衡二叉树

 

创建平衡二叉树

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=110;
int a[N];
struct node
{
    int data;
    struct node *l,*r;
}*root;
struct node *creat(node *root,int data)  //建树
{
    if (!root)
    {
        root=(struct node *)malloc(sizeof (node));
        root->l=root->r=NULL;
        root->data=data;
    }
    else
    {
        if (root->data>data)
        {
            root->l=creat(root->l,data);
        }
        else
        {
            root->r=creat(root->r,data);
        }
    }
    return root;  //返回根节点
}
void postorder(node *root)     //后序遍历
{
    if (root)
    {
        postorder(root->l);
        postorder(root->r);
        cout<<root->data<<' ';
    }
}
int main()
{
    int n;
    while (cin>>n)
    {
        root=(struct node *)malloc (sizeof (struct node ));   //创建根节点
        root=NULL;
        for (int i=1;i<=n;i++)
        {
            cin>>a[i];
            root=creat(root,a[i]);
        }
        postorder(root);
        puts("");
    }
    return 0;
}

 

 

 

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct node
{
    int data;
    node *l,*r;
    int deep;
}*root;
int deept(node *p)
{
    if (!p)return -1;
    return p->deep;
}
void LL (node *&p)
{
    node *q=p->l;
    p->l=q->r;
    q->r=p;
    p->deep=max(deept(p->r),deept(p->l))+1;
    q->deep=max(p->deep,deept(q->l))+1;
    p=q;
}
void RR(node *&p)
{
    node *q=p->r;
    p->r=q->l;
    q->l=p;
    p->deep=max(deept(p->l),deept(p->r))+1;
    q->deep=max(deept(q->r),p->deep)+1;
    p=q;
}
void LR (node *&p)
{
    RR(p->l);
    LL (p);
}
void RL (node *&p)
{
    LL(p->r);
    RR(p);
}
void Insert(node *&p,int k)
{
    if (!p)
    {
        p=(struct node *)malloc(sizeof (node));
        p->data=k;
        p->l=p->r=NULL;
        p->deep=1;
    }
    else if (k<p->data)
    {
        Insert(p->l,k);
        if (deept(p->l)-deept(p->r)>1)
        {
            if (k<p->l->data)
                LL(p);
            else
                LR(p);
        }
    }
    else if (k>p->data)
    {
        Insert(p->r,k);
        if (deept(p->r)-deept(p->l)>1)
        {
            if (k>p->r->data)
                RR(p);
            else
                RL(p);
        }
    }
    p->deep=max(deept(p->l),deept(p->r))+1;
}
signed main()
{
    int n;
    cin>>n;
    root=NULL;
    while (n--)
    {
        int x;
        cin>>x;
        Insert(root,x);
    }
    cout<<root->data<<endl;
    return 0;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐