1066. Root of AVL Tree (25)

这道题考察平衡二叉排列树,由于之前没有编写过平衡二叉排列树的代码,过程中出现了一些小错误
1.我存储的是高度,然后通过左右子树高度差来判断是否平衡,开始获取高度时未+1
2.root指针开始未赋值NULL

#include<iostream>
#include<cstdlib>
#include<cstdio>
#pragma warning(disable:4996)
using namespace std;

struct node {
    int data;//数据
    node *l, *r;//左右孩子的指针
    int h;//高度
    node() { h = 1;l = r = NULL; }
};

int Geth(node* &p)//求p的h
{
    if (p->l == NULL && p->r == NULL)  p->h = 1;
    else if (p->l == NULL &&p->r != NULL)p->h = p->r->h+1;
    else if (p->l != NULL  &&p->r == NULL) p->h = p->l->h+1;
    else p->h = p->l->h > p->r->h ? p->l->h+1 : p->r->h+1;
    return p->h;
}

int differ(node* &p)//求p的平衡读(左子数高度-右子树高度)不能出现绝对值>1
{
    if (p->l == NULL && p->r == NULL) return 0;
    else if (p->l == NULL &&p->r != NULL)return 0-p->r->h;
    else if (p->l != NULL  &&p->r == NULL)return p->l->h;
    else return p->l->h - p->r->h;
    return 0;
}


void L_Rotate(node* &p)//左旋
{
    node *temp = p->r;
    p->r = temp->l;
    Geth(p);
    temp->l = p;
    p = temp;
    Geth(p);
}

void R_Rotate(node* &p)//右旋
{
    node *temp = p->l;
    p->l = temp->r;
    Geth(p);
    temp->r = p;
    p = temp;
    Geth(p);
}

void insert_node(node* &root, int e)//插入节点
{
    if (root == NULL)//插入新节点
    {
        root = (node *)malloc(sizeof(node));
        root->data = e;root->h = 1;
        root->l = root->r = NULL;
    }
    else
    {
        if (root->data == e) return;//插入元素已存在,结束
        else if (root->data > e) insert_node(root->l, e);//插入元素小于root的值,插入左子树
        else insert_node(root->r, e);//cherub元素大于root的值,插入右子树
        Geth(root);
        if (differ(root) > 1)//L
        {
            switch (differ(root->l))
            {
            case 1:R_Rotate(root);//LL情况
                break;
            case -1:
                L_Rotate(root->l);//LR情况
                R_Rotate(root);
                break;
            }
        }
        else if (differ(root) < -1)//R
        {
            switch (differ(root->r))
            {
            case -1:L_Rotate(root);//RR情况
                break;
            case 1:
                R_Rotate(root->r);//RL情况
                L_Rotate(root);
                break;
            }
        }
    }
}
int flag;
void InOrderTraver(node* &root)//中序遍历,从小到大输出
{
    if (root == NULL) return;

    InOrderTraver(root->l);
    if (flag == 0) {
        printf("%d", root->data);flag++;
    }
    else printf(" %d", root->data);
    InOrderTraver(root->r);
}
int main()
{
    node *root = NULL;//root
    int N;
    scanf("%d", &N);
    root = NULL;
    while (N--)
    {
        int temp;
        scanf("%d", &temp);
        insert_node(root, temp);
    }
    /*flag = 0;
    InOrderTraver(root);*/
    cout << root->data << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值