参考了很多代码后自己的总结.个人感觉AVL树的代码比huffman树的代码更难理解,有些地方刚开始看的时候觉得疑惑,为什么网络上的讲解能那么肯定就是那样,后来自己画了很多二叉树后发现,确实就是那样,所以就干脆把某些东西当规律记下来了。-_-发个无语的小表情
一.简单的AVL树自我理解
二叉平衡树呀,就是说每个节点的左子树和右子树的高度差最多为1,一个节点没有左右子树,高度为0,然后每有一层高度加1,空树的高度在这里设定为-1.
二.avl树节点结构体定义
typedef struct AVL_Node
{
int data; //数据
int height;//节点高度
struct AVL_Node *llink;
struct AVL_Node *rlink;
}Node;
typedef Node* PNode;
三.主程序讲解
void main()
{
PNode root = NULL;
Insert(&root,3);
Insert(&root,2);
Insert(&root,1);
Insert(&root,4);
Insert(&root,5);
Insert(&root,6);
Insert(&root,7);
Insert(&root,10);
Insert(&root,9);
Insert(&root,8);
Inoreder(root);
printf("\n");
printf("查找节点7\n");
search(root,7);
printf("删除节点10\n");
Delete(&root,10);
search(root,9);
Inoreder(root);
}
接着看一下两个辅助函数
int NodeHeight(PNode* ptrTree) //返回节点高度
{
return (*ptrTree)==NULL ? -1 :(*ptrTree)->height;
}
int Max(int a,int b)//返回最大值
{
return a>b ? a : b;
}
AVL树的构建是通过插入节点实现的,并且在插入的过程中逐渐调整节点高度,最终生成二叉平衡树。为什么不用递归实现建立呢,那样的话就是我们事先画好一颗平衡二叉树,然后按顺序输入了,这就没有意义了。我们的目的就是让程序帮我们把输入的节点改造成平衡二叉树。
看一下Inoreder插入代码
int Insert(PNode *node,int x)
{
if((*node)==NULL)//节点为空插入这里
{
(*node) = (PNode)malloc(sizeof(Node));
(*node)->data = x;
(*node)->llink = NULL;
(*node)->rlink = NULL;
(*node)->height = 0;
return 1;
}
else if(x == (*node)->data)//原来存在该节点返回0,递归结束
{
return