AVL树

来源:互联网 发布:vscode js代码提示 编辑:程序博客网 时间:2024/06/07 11:48

Problem Description

根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。

Input

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

Output

输出平衡二叉树的树根。

Example Input

588 70 61 96 120

Example Output

70

#include <bits/stdc++.h>
using namespace std;int n;struct node{    int data, bf;    node *r, *l;};node *creat(){    node *root;    root = new(node);    root -> bf = 0;    root -> l = NULL;    root -> r = NULL;    return root;}int high(node *root){    if(root == NULL)        return -1;    else        return root -> bf;}node *ll(node *root){    node *p;    p = root -> l;    root -> l = p -> r;    p -> r = root;    root -> bf = max(high(root -> l), high(root -> r)) + 1;    p -> bf = max(high(p -> l), high(p -> r)) + 1;    return p;}node *rr(node *root){    node *p;    p = root -> r;    root -> r = p -> l;    p -> l = root;    root -> bf = max(high(root -> l), high(root -> r)) + 1;    p -> bf = max(high(p -> l), high(p -> r)) + 1;    return p;}node *lr(node *root){    root -> l = rr(root -> l);    return ll(root);}node *rl(node *root){    root -> r = ll(root -> r);    return rr(root);}void avl(node *&root, int k){    if(root == NULL)    {        root = creat();        root -> data = k;        return ;    }    if(k < root -> data)    {        avl(root -> l, k);        if(high(root -> l) - high(root -> r) == 2)        {            if(k < root -> l -> data)                root = ll(root);            else                root = lr(root);        }    }    if(k > root -> data)    {        avl(root -> r, k);        if(high(root -> r) - high(root -> l) == 2)        {            if(k > root -> r -> data)                root = rr(root);            else                root = rl(root);        }    }    root -> bf = max(high(root -> l), high(root -> r)) + 1;}void build(node *&root){    int i, x;    root = NULL;    for(i = 0; i < n; i++)    {        scanf("%d", &x);        avl(root, x);    }    return ;}int main(){    node *root;    scanf("%d", &n);    build(root);    printf("%d\n", root -> data);    return 0;}
//根据模板改编而成


原创粉丝点击