所谓的VAL树就是左子树与右子树的深度差最大为一,关于他的单旋转和双旋转其实就是为了保持平衡,每棵树的平衡都要维持左小右大的原则,如果我前面写的文章你都看懂了,这篇文章只需要看代码就可以理解,所以这里不做讲解了,直接上代码了,解开main函数注释即可看到效果!
#include <stdio.h>
#include <stdlib.h>
//定义Val树的存储结构
typedef struct TreeNode
{
int data; //数据域,这里为了操作方便假设值为Int
struct TreeNode *leftChild; //指针域,指向左孩子
struct TreeNode *rightChild; //指针域,指向右孩子
int height; //该节点的深度
char Exist; //标志着节点是否被删除,1为存在 0为删除
}TreeNode, *Postion ,*ValTree;
//对Val树进行初始化
void Init(ValTree *t)
{
(*t) = NULL;
}
//获取节点的深度,空为-1
int Height(Postion p)
{
if(p == NULL)
{
return -1;
}
else
{
return p -> height;
}
}
//获取最大值
int Max(int a, int b)
{
return a > b ? a : b;
}
//左树单选转
void SigleRotateByLeft(ValTree *t)
{
Postion axis; //作为旋转轴的节点
axis = (*t) -> leftChild;
(*t) -> leftChild = axis -> rightChild;
axis ->