• the Root Of AVL


    题目来源:陈越《数据结构》配套PTA;

    04-树5 Root of AVL Tree   (25分)

    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4 illustrate the rotation rules.

    Now given a sequence of insertions, you are supposed to tell the root of the resulting AVL tree.

    Input Specification:

    Each input file contains one test case. For each case, the first line contains a positive integer NN (le 2020) which is the total number of keys to be inserted. Then NN distinct integer keys are given in the next line. All the numbers in a line are separated by a space.

    Output Specification:

    For each test case, print the root of the resulting AVL tree in one line.

    Sample Input 1:

    5
    88 70 61 96 120
    

    Sample Output 1:

    70
    

    Sample Input 2:

    7
    88 70 61 96 120 90 65
    

    Sample Output 2:

    88
    解决思路:用课本提供的大部分程序,实现AVL插入和旋转,左旋,右旋,左-右旋,右-左旋;最后提取出根节点的数据:

    代码如下:

    #include <stdio.h>  
    #include <stdlib.h>  
    /*
    	Name: Root of AVL
    	Copyright: 
    	Author: demosses
    	Date: 23/04/17 11:11
    	Description: 
    */
    
    typedef  int ElementType;
    typedef struct AVLNode *Position; 
    typedef Position AVLTree;
    struct AVLNode {  
        ElementType Data;  
        ElementType Height;  
        AVLTree Left;  
        AVLTree Right;  
    };  
      
    AVLTree Insert(int X, AVLTree T);  
    int GetHeight(Position T);  
    int Max(int a, int b);  
    AVLTree SingleLeft(Position K);  
    AVLTree SingleRight(Position K);  
    AVLTree DoubleLeftRight(Position K);  
    AVLTree DoubleRightLeft(Position K);  
      
    int main(void) {  
        AVLTree T = NULL;  
        int N;  
        scanf("%d", &N);  
        while (N--) {  
            int x;  
            scanf("%d", &x);  
            T=Insert(x, T);  
        }  
        if (T)  
            printf("%d", T->Data);  
        return 0;  
    }  
      
    AVLTree Insert(ElementType X, AVLTree T) {  
        if (!T) {  /*插入为空树*/ 
            T = (AVLTree)malloc(sizeof(struct AVLNode));  
            T->Data = X;  
            T->Height = 1;  
            T->Left = T->Right = NULL;  
        }  
        else if (X < T->Data) { 
    	      /*插入T的左子树*/ 
            T->Left = Insert(X, T->Left);  
             /*需要旋转*/ 
            if (GetHeight(T->Left) - GetHeight(T->Right) == 2) {  
                if (X < T->Left->Data) 
    			  /*左单旋*/ 
                    T = SingleLeft(T);  
                else  
                 /*左-右双旋*/ 
                    T = DoubleLeftRight(T);  
            }  
        }  
        else if (X > T->Data) {  
              /*插入T的右子树*/
            T->Right = Insert(X, T->Right); 
    		    /*需要旋转*/ 
            if (GetHeight(T->Right) - GetHeight(T->Left) == 2) {  
                if (X > T->Right->Data)  
                      /*右单旋*/ 
                    T = SingleRight(T);  
                else  
                  /*左-右双旋*/
                    T = DoubleRightLeft(T);  
            }  
        }  
        T->Height = Max(GetHeight(T->Left), GetHeight(T->Right)) + 1;  
        return T;  
    }  
      
    int GetHeight(AVLTree T) {  
       int HL,HR,MaxH;
       
    	   if(T){
    	   HL=GetHeight(T->Left); 
    	   HR=GetHeight(T->Right);
    	   MaxH=Max(HL,HR);
    	   return (MaxH+1);
    	}
      else
         return 0;	
    }  
      
    int Max(int a,int b) {  
        return (a > b) ? a : b;  
    }  
      
    AVLTree SingleLeft(AVLTree A) { 
       /*左单旋*/ 
        AVLTree B;  
        B=A->Left;  
        A->Left=B->Right;  
        B->Right=A;  
         
        A->Height = Max(GetHeight(A->Left), GetHeight(A->Right)) + 1;  
        B->Height = Max(GetHeight(B->Left), A->Height) + 1;  
        return B;  
    }  
      
    AVLTree SingleRight(AVLTree A) {
        /*右单旋*/  
        AVLTree B;  
        B=A->Right;  
        A->Right=B->Left;  
        B->Left=A; 
         
        A->Height = Max(GetHeight(A->Left), GetHeight(A->Right)) + 1;  
        B->Height = Max(GetHeight(B->Right), A->Height) + 1;   
        return B;  
    }  
      
    AVLTree DoubleLeftRight(AVLTree A) {  
       /*右-左单旋*/ 
        A->Left = SingleRight(A->Left);   
        return SingleLeft(A);  
    }  
      
    AVLTree DoubleRightLeft(AVLTree A) { 
       /*左-右单旋*/ 
        A->Right = SingleLeft(A->Right);  
        return SingleRight(A);  
    }


  • 相关阅读:
    java学习之—栈
    java中的a++与++a的区别
    java学习之—数组的曾删改查
    Mybatis #{ } 和 ${ } 区别
    详解Windows不重启使环境变量修改生效(经典)
    laravel artisan常用命令
    Laravel 出现 No application encryption key has been specified.
    springboot的几种启动方式
    Angular 服务的简单使用
    Angular-1.6 路由 简单使用
  • 原文地址:https://www.cnblogs.com/jacksin/p/8830221.html
Copyright © 2020-2023  润新知