題目描述
將給定的一系列數字插入初始爲空的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;
}
提交截圖
發現問題
我用的這種方法的左右旋和右左旋是有問題的,沒有考慮周到,但是測試案例通過了。
思路分析裏面是正確的思路,我的程序裏面是有問題的,但是測試案例都通過了,很奇怪!