PAT 1066 Root of AVL Tree (25)

题意

给出N个正整数,将他们依次插入一课初始为空的AVL树上,求插入后的根节点的值

思路

无论是LL,LR,RL,RR型,我们都可以看成把第二大的当作子树的根,最小的为它的左子树,最大的为右子树,这样就可以方便的计算啦(具体过程可以参考邓俊辉的《数据结构》相关内容,强推!!!)

代码


#include<iostream>
#include<cmath>
#include<algorithm>
#include<stack>
#define getFater( a)  (a->father)
#define getHeight(a) (a==NULL?0:a->height)
#define isRoot(a) (a->father == NULL)
using namespace std;

typedef struct NODE
{
    int value;
    NODE * father;
    int height;
    NODE * lchild, *rchild;
}NODE ,*TREE;
TREE t;
NODE * opt34(NODE *a, NODE* b, NODE *c, NODE *t1, NODE* t2, NODE*t3, NODE*t4);


//判断是不是父节点的左子树
bool isLchild(NODE *a) { return (!isRoot(a) && (a->father->lchild == a)); }
//获取决定node的高度的那个子节点
NODE * getTallerChild(NODE * node) { return (((getHeight(node->lchild)) > (getHeight(node->rchild))) ? (node->lchild) : (node->rchild)); }


//更新高度
void updateHeight(NODE * node)
{
    node->height =  max(getHeight(node->lchild), getHeight(node->rchild))+1;
    
}

//插入
NODE * insert(NODE * &node,NODE * &father,int a)
{
    if (node == NULL)
    {
        node = new NODE;
        node->lchild = node->rchild = NULL;
        if (father != node)
            node->father = father;
        else
            node->father = NULL;
        node->height = 1;
        node->value = a;
        return node;
    }
    else
    {
        if (node->value < a)
             return insert(node->rchild, node, a);
        else
            return insert(node->lchild,node,a);
    }
    
}

//旋转
NODE * rotateAT(NODE * a)
{
    NODE *b = a->father;
    NODE *c = b->father;
    if (isLchild(a))
    {
        if (isLchild(b))
        {
            b->father = c->father;
            return opt34(a, b, c, a->lchild, a->rchild, b->rchild, c->rchild);
        }
        else
        {
            a->father = c->father;
            return opt34(c, a, b, c->lchild, a->lchild, a->rchild, b->rchild);
        }
    }
    else
    {
        if (!(isLchild(b)))
        {
            b->father = c->father;
            return opt34(c, b, a, c->lchild, b->lchild, a->lchild, a->rchild);
        }
        else
        {
            a->father = c->father;
            return opt34(b, a, c, b->lchild, a->lchild, a->rchild, c->rchild);
        }
    }
}

//具体操作3+4
NODE * opt34(NODE *a,NODE* b,NODE *c,NODE *t1,NODE* t2,NODE*t3,NODE*t4)
{
    a->lchild = t1; if (t1 != NULL) t1->father = a;
    a->rchild = t2; if (t2 != NULL) t2->father = a;
    updateHeight(a);
    c->lchild = t3; if (t3 != NULL) t3->father = c;
    c->rchild = t4; if (t4 != NULL) t4->father = c;
    updateHeight(c);
    b->lchild = a; a->father = b;
    b->rchild = c; c->father = b;
    updateHeight(b);
    return b;
}

bool AvlBalanced(NODE * g)
{
    int height;
    height = getHeight(g->lchild)- getHeight(g->rchild);
    return (-2 < height)&&(height < 2);
}


//插入过程
void insertAVL(int x)
{
    NODE *temp = insert(t,t,x);
    for (NODE * g = getFater(temp);g!=NULL;g = getFater(g))
    {
               /*
              原来代码这么写,然后一直只有最后一个测试点过了,并且出现段错误
              (isRoot(g) ? t : (isLchild(g) ? (g)->father->lchild : (g)->father->rchild)) =               rotateAT(getTallerChild(getTallerChild(g)));
              然后改为下文这么一串就对了
              */

        if (!AvlBalanced(g))//情愿代码写长一点,呜呜呜
        {
            if (g == t)
            {
                t = rotateAT(getTallerChild(getTallerChild(g)));
            }
            else
            {
                if (g == g->father->lchild)
                {
                    g->father->lchild = rotateAT(getTallerChild(getTallerChild(g)));
                }
                else
                    g->father->rchild = rotateAT(getTallerChild(getTallerChild(g)));
            }
            
            break;
        }
        else
            updateHeight(g);
    }
    return ;
}

int main()
{
    t = NULL;
    int n;
    int value;
    int ore[25];
    scanf("%d",&n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d",&value);
        insertAVL(value);
    }
    printf("%d\n",t->value);
    system("pause");
    return 0;
}


后记

这一题的通过率超级高,然而我一开始还是只对了一个测试点,并且测试点4和5出现段错误,现在还是不知道为什么,希望能够灵光一现,然后解决,嘻嘻

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 定义 平衡二叉树,是对二叉搜索树的一种优化。 向二叉搜索树中插入元素时,不同的插入次序,将构造出不同结构的树。通俗...
    IAM四十二阅读 4,003评论 0 2
  • 一直以来,我都很少使用也避免使用到树和图,总觉得它们神秘而又复杂,但是树在一些运算和查找中也不可避免的要使用到,那...
    24K男阅读 6,739评论 5 14
  • 树的高度和深度 From CSDN 暴走抹茶MOUKOY 1.高度 对于高度的理解,我们不管他数据结构什么什么知识...
    _Nullptr阅读 1,297评论 0 2
  • 1. AVL树 AVL树简单来说是带有平衡条件的二叉查找树.传统来说是其每个节点的左子树和右子树的高度最多差1(注...
    fredal阅读 1,831评论 0 4
  • 树 树 树是一种重要的数据结构,通过链表建立一棵树: 用链表的结构构建树,就是使树的每一条分支都建立一个链表来存储...
    JnJnLee阅读 225评论 0 0