平衡二叉树的学习

本文介绍了一个基于给定序列构建平衡二叉树的算法,并详细展示了如何通过旋转操作保持树的平衡,最终找到构建完成的平衡二叉树的根节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平衡二叉树的学习

数据结构实验之查找二:平衡二叉树
Time Limit: 400 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
Problem Description
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。

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

Output
输出平衡二叉树的树根。

Sample Input
5
88 70 61 96 120
Sample Output
70

此题链接→

#include<stdio.h>
#include<stdlib.h>
struct node
{
    int data;
    int height;//高度
    struct node *left, *right;
};//节点
int N;//元素的个数
typedef struct node* Node;
int deep(Node T)
{
    if(T == NULL)return 0;
    else return T->height;
}

Node LL(Node T)
{
    Node temp;
    temp = T->left;
    T->left = temp->right;
    temp->right = T;
     T->height = deep(T->left)>deep(T->right)?deep(T->left)+1:deep(T->right)+1;
    temp->height = deep(temp->left)>deep(temp->right)?deep(temp->left)+1:deep(temp->right)+1;

    return temp;

}
Node RR(Node T)
{
    Node temp;
    temp = T->right;
    T->right = temp->left;
    temp->left = T;
     T->height = deep(T->left)>deep(T->right)?deep(T->left)+1:deep(T->right)+1;
    temp->height = deep(temp->left)>deep(temp->right)?deep(temp->left)+1:deep(temp->right)+1;


    return temp;
}
Node LR(Node T)
{
    T ->left = RR(T->left);
    T = LL(T);

    return T;
}
Node RL(Node T)
{
    T->right = LL(T->right);
    T = RR(T);
    return T;
}

Node Insert(Node T, int num)
{
    if(T == NULL)//如果为空
    {
        T = (Node)malloc(sizeof(struct node));
        T ->data = num;
        T->left = NULL;
        T->right = NULL;
        T->height = 1;

    }


    if(T->data == num)return T;//如果 不能储存相等的 ,
    else if(num < T->data)//如果比他小
    {

        T->left = Insert(T->left, num);
        if(deep(T->left)-deep(T->right)>1)
        {
            if(num<T->left->data)
            {
                T = LL(T);
            }
            else
            {
                T = LR(T);
            }
        }

    }
    else if(num > T->data)//如果比他大
    {

          T->right =  Insert(T->right, num);
          if(deep(T->right)- deep(T->left)>1)
          {
              if(num > T->right->data)
              {
                  T =RR(T);
              }
              else
              {
                  T =RL(T);
              }
          }

    }
    T->height = deep(T->left)>deep(T->right)?deep(T->left)+1:deep(T->right)+1;







    return T;
}

Node Creat()
{
    Node T = NULL;
    int i;
    int num;//插入的数
    for(i = 0; i < N; i++)
    {

        scanf("%d", &num);
        T = Insert(T, num);

    }
    return T;
}




int main ()
{

    Node root = NULL;//根节点
    scanf("%d",&N);
    root = Creat();
    printf("%d", root->data);



    return 0;
}



posted @ 2019-03-07 23:12 Monkey1 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值