1066. Root of AVL Tree

来源:互联网 发布:河南科技学院网络教学 编辑:程序博客网 时间:2024/06/03 12:29

终于主动写了一次AVL树。。。果然还是有点晕

这是学习了别人的,照着改的

#include <iostream>#include <stdio.h>using namespace std;struct Node{    int value;    int height;    Node *left;    Node *right;    Node(int v, int h, Node *l, Node *r):value(v), height(h), left(l), right(r){}};typedef Node * Tree;int height(Node *node){    if(node == NULL)        return -1;    else        return node->height;}void Lrotate(Tree &node){    Tree temp = node->left;    node->left = temp->right;    temp->right = node;    temp->height = max(height(temp->left), height(temp->right))+1;    node->height = max(height(node->right), height(node->left))+1;    node = temp;}void Rrotate(Tree &node){    Tree temp = node->right;    node->right = temp->left;    temp->left = node;    temp->height = max(height(temp->right), height(temp->left))+1;    node->height = max(height(node->right), height(node->left))+1;    node = temp;}void LRrotate(Tree &node){    Rrotate(node->left);    Lrotate(node);}void RLrotate(Tree &node){    Lrotate(node->right);    Rrotate(node);}void build(Tree &tree, int x){    if(tree == NULL)    {        tree = new Node(x, 0, NULL, NULL);        return;    }    if(x < tree->value)    {        build(tree->left, x);        if(height(tree->left) - height(tree->right) == 2)        {            if(x < tree->left->value)                Lrotate(tree);            else                LRrotate(tree);        }    }    else    {        build(tree->right, x);        if(height(tree->right) - height(tree->left) == 2)        {            if(x > tree->right->value)                Rrotate(tree);            else                RLrotate(tree);        }    }    tree->height = max(height(tree->left), height(tree->right))+1;}int main(){    int n;    int x;    Tree tree = NULL;    cin >> n;    for(int i = 0; i < n; i++)    {        cin >> x;        build(tree,x);    }    cout << tree->value << endl;    return 0;}


0 0
原创粉丝点击