think:
1 今天学习了平衡二叉树的知识,感觉还是不理解,自己照着部分模板敲了代码,但是也不知道自己的学习方法对不对,不知道自己是不是有点拔苗助长的滋味,数据结构树的部分,从最开始的二叉树的遍历,到搜索二叉树,再到现在的平衡二叉树,感觉自己有很多细节并没有理解,很多时候感觉可能只会用一些模板,而对其深刻的思想却领悟的并不透彻,数据结构从开始的线性表,感觉自己并没有脚踏实地的一步一步走坚固,或许自己最初应该从指针开始打下坚固的地基,否则感觉自己愈行愈艰难,知识体系的建立犹如不断抛出自己手中的锚,将之前接触到学习到的知识与自己当前学习的知识联系起来,逐渐得到一种融会贯通的效果。下面进入联系题目的空间吧。
数据结构实验之查找二:平衡二叉树
Time Limit: 400MS Memory Limit: 65536KB
Problem Description
根据给定的输入序列建立一棵平衡二叉树,求出建立的平衡二叉树的树根。
Input
输入一组测试数据。数据的第1行给出一个正整数N(n <= 20),N表示输入序列的元素个数;第2行给出N个正整数,按数据给定顺序建立平衡二叉树。
Output
输出平衡二叉树的树根。
Example Input
5
88 70 61 96 120
Example Output
70
Hint
Author
xam
以下为accepted建议参考代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Max(a, b) (a > b? a: b)
typedef struct node
{
int Data;
int Hight;//树高
struct node *left;
struct node *right;
} AVLTree;
int GetHight(AVLTree *T)
{
if(T)
return T->Hight;
else
return 0;
}
AVLTree * SingleLeftRotation(AVLTree *A)
{ /* A必须有一个左子结点B*/
/* 将A与B左单旋,更新A与B的高度,返回新的根结点*/
AVLTree *B = A->left;
A->left = B->right;
B->right = A;
A->Hight = Max(GetHight(A->left), GetHight(A->right)) + 1;
B->Hight = Max(GetHight(B->left), A->Hight) + 1;
return B;
}
AVLTree * SingleRightRotation(AVLTree *A)
{
/* A必须有一个右子结点B*/
/* 讲A与B做右单旋,更新A与B的高度,返回新的根结点B*/
AVLTree *B = A->right;
A->right = B->left;
B->left = A;
A->Hight = Max(GetHight(A->left), GetHight(A->right)) + 1;
B->Hight = Max(GetHight(B->left), A->Hight) + 1;
return B;
}
AVLTree * DoubleLeftRightRotation(AVLTree *A)
{ /* A必须有一个左子结点B, 且B必须有一个右子结点C*/
/* 将A, B, C做两次单旋,返回新的根结点C*/
/* 将B与C做右单旋, C被返回*/
A->left = SingleRightRotation(A->left);
/* 将A与C做左单旋, C被返回*/
return SingleLeftRotation(A);
}
AVLTree * DoubleRightLeftRotation(AVLTree *A)
{ /* A必须有一个右子结点B, 且B必须有一个左子结点C*/
/* 将A, B, C做两次单旋,返回新的根结点C*/
/* 将B与C做左单旋, C被返回*/
A->right = SingleLeftRotation(A->right);
/* 将A与C做右单旋, C被返回*/
return SingleRightRotation(A);
}
AVLTree * Insert(AVLTree *T, int x)//将x插入AVL树中,并且返回调整后的AVL树
{
if(T == NULL)
{
T = (AVLTree *)malloc(sizeof(AVLTree));
T->