练习4.2 平衡二叉树的根 (25 分) 浙大版《数据结构(第2版)》题目集

将给定的一系列数字插入初始为空的AVL树,请你输出最后生成的AVL树的根结点的值。

输入格式:

输入的第一行给出一个正整数N(≤),随后一行给出N个不同的整数,其间以空格分隔。

输出格式:

在一行中输出顺序插入上述整数到一棵初始为空的AVL树后,该树的根结点的值。

输入样例1:

5
88 70 61 96 120

输出样例1:

70

输入样例2:

7
88 70 61 96 120 90 65 

输出样例2:

88
主要考查avl树的调整过程。
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node Node;
struct Node {
    int Data;
    struct Node *Left,*Right;
}*head = NULL;
Node *New(int d) {
    Node *node = (Node *)malloc(sizeof(Node));
    node -> Data = d;
    node -> Left = node -> Right = NULL;
    return node;
}
Node *ll(Node *node) {
    Node *l = node -> Left;
    node -> Left = l -> Right;
    l -> Right = node;
    return l;
}
Node *rr(Node *node) {
    Node *r = node -> Right;
    node -> Right = r -> Left;
    r -> Left = node;
    return r;
}
Node *lr(Node *node) {
    node -> Left = rr(node -> Left);
    return ll(node);
}
Node *rl(Node *node) {
    node -> Right = ll(node -> Right);
    return rr(node);
}
int max(int a,int b) {
    return a > b ? a : b;
}
int Height(Node *node) {
    return node == NULL ? 0 : max(Height(node -> Left),Height(node -> Right)) + 1;
}
Node* Insert(Node *node,int d) {
    if(node == NULL) {
        node = New(d);
    }
    else if(d < node -> Data) {
        node -> Left = Insert(node -> Left,d);
    }
    else {
        node -> Right = Insert(node -> Right,d);
    }
    if(Height(node -> Left) - Height(node -> Right) == 2) {
        if(d < node -> Left -> Data) {
            node = ll(node);
        }
        else {
            node = lr(node);
        }
    }
    else if(Height(node -> Left) - Height(node -> Right) == -2) {
        if(d > node -> Right -> Data) {
            node = rr(node);
        }
        else {
            node = rl(node);
        }
    }
    return node;
}
int main() {
    int n,d;
    scanf("%d",&n);
    for(int i = 0;i < n;i ++) {
        scanf("%d",&d);
        head = Insert(head,d);
    }
    printf("%d",head -> Data);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/8023spz/p/11875946.html