PTA 7-1 平衡二叉樹的根

題目描述

將給定的一系列數字插入初始爲空的AVL樹,請你輸出最後生成的AVL樹的根結點的值。

輸入格式:

輸入的第一行給出一個正整數N(≤20),隨後一行給出N個不同的整數,其間以空格分隔。

輸出格式:

在一行中輸出順序插入上述整數到一棵初始爲空的AVL樹後,該樹的根結點的值。

輸入樣例1:

5
88 70 61 96 120

輸出樣例1:

70

輸入樣例2:

7
88 70 61 96 120 90 65

輸出樣例2:

88

思路分析

在建樹的時候就直接建成二叉搜索樹,每次加一個節點後從加入的節點到根節點進行平衡判斷,找到被破壞平衡的節點,判斷是左單旋,右單旋,左右旋還是右左旋。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

源代碼

#include <stdio.h>
#include<stdlib.h>
typedef struct node *AVLTree;
struct node{
    int Data;
    AVLTree Left;
    AVLTree Right;
};
int High(AVLTree T){
    if(!T)
        return 0;
    int left=High(T->Left)+1;
    int right=High(T->Right)+1;
    return left>right?left:right;
}
AVLTree LL(AVLTree T){
    AVLTree T1;
    T1=T->Right;
    T->Right=T1->Left;
    T1->Left=T;
    return T1;
}
AVLTree RR(AVLTree T){
    AVLTree T1;
    T1=T->Left;
    T->Left=T1->Right;
    T1->Right=T;
    return T1;
}
AVLTree LR(AVLTree T){
    AVLTree T1,T2;
    T1=T->Left;
    T2=T1->Right;
    T->Left=NULL;
    T2->Right=T;
    T1->Right=NULL;
    T2->Left=T1;
    return T2;
}
AVLTree RL(AVLTree T){
    AVLTree T1,T2;
    T1=T->Right;
    T2=T1->Left;
    T->Right=NULL;
    T2->Left=T;
    T1->Left=NULL;
    T2->Right=T1;
    return T2;
}
AVLTree Insert(AVLTree T,int x){
    if(!T){
        AVLTree T =(AVLTree)malloc(sizeof(struct node));
        T->Data=x;
        T->Left=T->Right=NULL;
        return T;
    }else if(x>T->Data){
        T->Right=Insert(T->Right,x);
        if((High(T->Right)-High(T->Left))>=2){
            if(x>T->Right->Data)
                T=LL(T);
            else
                T=RL(T);
        }
    }else if(x<T->Data){
        T->Left=Insert(T->Left,x);
        if((High(T->Left)-High(T->Right))==2){
            if(x<T->Left->Data)
                T=RR(T);
            else
                T=LR(T);
        }
    }
    return T;
}
int main() { 
	int n,x;
	AVLTree T=NULL;
	scanf("%d",&n);
	for (int i = 0; i < n; i++) {
	    scanf("%d",&x);
	    T=Insert(T,x);
	}
	printf("%d\n",T->Data);
	return 0;
}

提交截圖

在這裏插入圖片描述

發現問題

我用的這種方法的左右旋和右左旋是有問題的,沒有考慮周到,但是測試案例通過了。
思路分析裏面是正確的思路,我的程序裏面是有問題的,但是測試案例都通過了,很奇怪!
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章