题目位置
分析:
直接硬上:1、构造 判断树(解决插入问题)。
2、构造 后续遍历(解决 每一个指针的 平衡因子数的计算)。
3、通过判断树的平衡因子正负,进而可知 是ll,rr,lr,rl的哪一种。
4、 构造这4种选择方式。
5、在解决后进行 最后一次的 后序遍历 在计算平衡因子。
【注】在插入的时候其实 是一个 和 后续遍历类似的 递归函数,进而 通过这一特性,可以实时掌控哪一个地方 平衡因子 先被破坏,尽而进行rotation,再返回指针。解决了 root改变后的丢失问题。
关于ll,rr,lr,rl : 最简单实现lr 和rl 方法 就是借用ll循环 和rr循环 来做。
#include <stdio.h>
#include <stdlib.h>
typedef struct BinTree *Tree;
struct BinTree{
int data;
Tree left;
Tree right;
int balance;
};
Tree InsertJudgeTree(Tree T,int data);
void postTraverse(Tree T);
int BalanceCalculator(Tree T);
Tree rl(Tree T);
Tree ll(Tree T);
Tree rr(Tree T);
Tree lr(Tree T);
int main(){
int i,j;
int N;
int data;
Tree T=NULL;
scanf("%d",&N);
for(i=0;i<N;i++){
scanf("%d",&data);
T = InsertJudgeTree(T,data);
BalanceCalculator(T);
//postTraverse(T);
//printf("\n");
}
printf("%d",T->data);
// printf("%d",T->data);
// printf("\n");
// postTraverse(T);
// int a = BalanceCalculator(T);
// printf("\n");
// printf("\n%d",a);
}
Tree ll(Tree T){
Tree B = T->left;
T->left = B->right;
B->right =T;
return B;
}
Tree rr(Tree T){
Tree B = T->right;
T->right = B->left;
B->left =T;
return B;
}
Tree lr(Tree T){
T->left = rr(T->left);
return ll(T);
}
Tree rl(Tree T){
T->right = ll(T->right);
return rr(T);
}
void postTraverse(Tree T){
if(!T) return ;
else {
postTraverse(T->left);
postTraverse(T->right);
printf("%d ",T->data);
}
}
int BalanceCalculator(Tree T){
if(!T) return 0;
else {
int ltHeight=BalanceCalculator(T->left);
int rtHeight=BalanceCalculator(T->right);
T->balance = ltHeight-rtHeight;
return ltHeight<rtHeight?rtHeight+1:ltHeight+1;
}
}
Tree InsertJudgeTree(Tree T,int data){
if(!T){
T=(Tree)malloc(sizeof(struct BinTree));
T->data =data;
T->left = NULL;
T->right = NULL;
T->balance = 0;
return T;
}
else{if(T->data<data){
T->right = InsertJudgeTree(T->right,data);
BalanceCalculator(T);
if(abs(T->balance)==2){
if(T->right->balance<0)T=rr(T);
else T=rl(T);
}
}
else if (T->data>data){
T->left = InsertJudgeTree(T->left,data);
BalanceCalculator(T);
if(abs(T->balance)==2){
if(T->left->balance>0)T=ll(T);
else T=lr(T);
}
}
}
BalanceCalculator(T);
return T;
}