zoukankan      html  css  js  c++  java
  • 练习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;
    }
  • 相关阅读:
    go 学习成长之路
    多个ssh key 配置多个网址
    ubuntu 安装 gightingale
    关于open falcon 与nightingale 的一些调研
    kubeadm 命令简介
    windows kubectl 远程操作k8s
    ubuntu18.04 kuebadm 安装 k8s-1.15.9
    kubeadm 如何将节点加入集群
    centos7 kubeadm 搭建k8s
    docker 常用命令
  • 原文地址:https://www.cnblogs.com/8023spz/p/11875946.html
Copyright © 2011-2022 走看看