pat(A) 1066. Root of AVL Tree

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<stdlib.h>
#define Max(a,b) ((a)>(b)?(a):(b))
using namespace std;

struct Node
{
    int value;
    Node* l;
    Node* r;
    int BF;		//左子树高度 - 右子树高度
    void init(int v)
    {
        value=v;
        l=NULL;
        r=NULL;
        BF=0;
    }
};

int Abs(int a)
{
    return a>=0?a:-a;
}

int getBF(Node* p)
{
    if(p == NULL)
        return -1;
    return p->BF;

}

bool isBalanced(Node* p)
{
    return Abs(getBF(p->l) - getBF(p->r)) < 2;
}

Node* LL(Node* p)
{
    Node* child = p->l;
    p->l = child->r;
    child->r = p;

    p->BF = Max(getBF(p->l),getBF(p->r)) + 1;
    child->BF = Max(getBF(child->l),getBF(child->r)) + 1;
    return child;
}

Node* RR(Node* p)
{
    Node* child = p->r;
    p->r= child->l;
    child->l = p;

    p->BF = Max(getBF(p->l),getBF(p->r)) + 1;
    child->BF = Max(getBF(child->l),getBF(child->r)) + 1;
    return child;
}

Node* LR(Node* p)
{
    Node* child = p->l;
    p->l = RR(child);
    return LL(p);
}

Node* RL(Node* p)
{
    Node* child = p->r;
    p->r =LL(child);
    return RR(p);
}

Node* Insert(Node* p,int x)
{
    if(p!=NULL)
    {
        if(x>p->value)		//R
        {
            p->r= Insert(p->r,x);
            if(!isBalanced(p))
            {
                if(x> p->r->value)	//R-R
                    p = RR(p);
                else							//R-L
                   p=RL(p);
            }
        }
        else							//L
        {
            p->l= Insert(p->l,x);
            if(!isBalanced(p))
            {
                if(x > p->l->value)	//L-R
                    p = LR(p);
                else							//L-L
                    p = LL(p);
            }
        }
    }
    else
    {
        p=(Node*)malloc(sizeof(Node));
        (*p).init(x);
    }
    p->BF = Max(getBF(p->l),getBF(p->r)) + 1;
    return p;
}

/*void PrintTree(Node* root)//先序遍历AVL树
{
    if(root != NULL)
    {
        cout<<root->value<<"--";
        PrintTree(root->l);
        PrintTree(root->r);
    }
}*/

int main()
{
    int n;
    while(scanf("%d",&n)==1)
    {
        Node* root=NULL;
        int x;
        for(int i=0; i<n; i++)
        {
            scanf("%d",&x);
            root=Insert(root,x);
        }
        printf("%d\n",root->value);
        //PrintTree(root);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-13 02:03:51

pat(A) 1066. Root of AVL Tree的相关文章

PAT 甲级 1066 Root of AVL Tree (25 分)(快速掌握平衡二叉树的旋转,内含代码和注解)***

1066 Root of AVL Tree (25 分) An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this

PAT 甲级 1066 Root of AVL Tree

https://pintia.cn/problem-sets/994805342720868352/problems/994805404939173888 An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by m

1066. Root of AVL Tree (25)【AVL树】——PAT (Advanced Level) Practise

题目信息 1066. Root of AVL Tree (25) 时间限制100 ms 内存限制65536 kB 代码长度限制16000 B An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more tha

PAT 1066 Root of AVL Tree[AVL树][难]

1066 Root of AVL Tree (25)(25 分) An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore

PTA (Advanced Level)1066 Root of AVL Tree

Root of AVL Tree An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. F

1066. Root of AVL Tree (25)

时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than o

PAT (Advanced Level) 1066. Root of AVL Tree (25)

AVL树的旋转.居然1A了.... 了解旋转方式之后,数据较小可以当做模拟写. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include<map> #include<stack> #include<queue> #include<string> #include<algorithm> using name

PAT 1066 Root of AVL Tree

#include <cstdio> #include <cstdlib> class Node { public: Node* L; Node* R; int height; int data; Node(int val, Node* l = NULL, Node* r = NULL, int h = 0): data(val), L(l), R(r), height(h) {} }; inline int height(Node* node) { if (node == NULL

PAT甲级题解-1066. Root of AVL Tree (25)

我嗯,这道题比较讨厌,非常难,需要用到马尔科夫随便链.高斯混合复制模型.神经网络还需要用到本人的模拟退火算法进行优化搜索,为了搜索文章避免陷入局部优化,还得用到一些Tabu Search代码比较多写的有点乱七八糟,有的还点长,都贴到laji的网站如了.布料布衣价格上涨,扣子费用降低.这样导致过程很难算,有难度,但还是有点意思的,建议自省反省考虑下,嗯么. #include <iostream> #include <cstdio> #include <algorithm>