数据结构实验之查找二:平衡二叉树

来源:互联网 发布:spss数据分析师认证 编辑:程序博客网 时间:2024/06/05 19:37

Think:
平衡二叉树 AVL 树, 记住基本操作 就大概挺容易了吧 主要操作有
LL

struct node *LL(struct node *t){    struct node *p = t -> l;    t -> l = p -> r;    p -> r = t;    p -> d = max(deep(p -> l), t -> d) + 1;    t -> d = max(deep(t -> l),deep(t -> r)) + 1;    return p;}

RR

struct node *RR(struct node *t){    struct node *p = t -> r;    t -> r = p -> l;    p -> l = t;    p -> d = max(deep(p -> l),t -> d) + 1;    t -> d = max(deep(t -> l),deep(t -> r)) + 1;    return p;}

RL

struct node *RL(struct node *t){    t -> r = LL(t -> r);    return RR(t);}

LR

struct node *LR(struct node *t){    t -> l = RR(t -> l);    return LL(t);}

Problem Description

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

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

输出平衡二叉树的树根。
Example Input

5
88 70 61 96 120
Example Output

70

#include<bits/stdc++.h>using namespace std;typedef int Elemtype;struct node{    Elemtype data;    int d;    struct node *l, *r;};struct node *creat(struct node *t, int x);int max(int a, int b);int deep(struct node *t);struct node *LL(struct node *t);struct node *RR(struct node *t);struct node *RL(struct node *t);struct node *LR(struct node *t);int main(){    int n, m, i;    cin >> n;    struct node *tree = NULL;    for (i = 0; i <= n - 1; i ++)    {        cin >> m;        tree = creat(tree , m);    }    cout << tree -> data<<endl;    return 0;}struct node *creat(struct node *t, int x){    if (t == NULL)    {        t = new node;        t ->data = x;        t -> d = 0;        t -> l = t -> r = NULL;    }    else if (t -> data > x)    {        t -> l = creat(t -> l , x);        if (deep(t -> l) - deep(t -> r) > 1)        {            if (t -> l -> data > x)                t = LL(t);            else                t = LR(t);        }    }    else if (t -> data < x)    {        t -> r = creat(t -> r, x);        if (deep(t -> r) - deep(t -> l) > 1)        {            if (t -> r -> data < x)                t = RR(t);            else                t = RL(t);        }    }    t -> d = max(deep(t -> l), deep(t -> r)) + 1;    return t;}int max(int a, int b){    if (a > b)        return a;    else        return b;}int deep(struct node *t){    if (t == NULL)        return -1;    else        return t -> d;}struct node *LL(struct node *t){    struct node *p = t -> l;    t -> l = p -> r;    p -> r = t;    p -> d = max(deep(p -> l), t -> d) + 1;    t -> d = max(deep(t -> l),deep(t -> r)) + 1;    return p;}struct node *RR(struct node *t){    struct node *p = t -> r;    t -> r = p -> l;    p -> l = t;    p -> d = max(deep(p -> l),t -> d) + 1;    t -> d = max(deep(t -> l),deep(t -> r)) + 1;    return p;}struct node *RL(struct node *t){    t -> r = LL(t -> r);    return RR(t);}struct node *LR(struct node *t){    t -> l = RR(t -> l);    return LL(t);}
阅读全文
0 0
原创粉丝点击