平衡二叉树概念
平衡二叉查找树:简称平衡二叉树。由前苏联的数学家Adelse-Velskil和Landis在1962年提出的高度平衡的二叉树,根据科学家的英文名也称为AVL树。
什么叫“平衡”,直观上的最佳平衡条件就是 每个节点的左右子树有着相同高度,但这确实太过苛刻。平衡二叉树AVL tree退而求其次,要求任何节点的左右节点的左右子树高度差不超过1
平衡二叉树的调整
LL型调整
100为根节点传入,将90作为新的根节点,并使100为90的右子树,将90原来的右子树变为100的左子树
void LL_RRotate(PPNODE Node)
{
if (Node == NULL)
{
return;
}
PNODE v1 = (*Node)->Left;
if (v1==NULL)
{
return;
}
(*Node)->Left = v1->Right;
v1->Right = (*Node);
(*Node) = v1;
}
RR型调整
void RR_LRotate(PPNODE Node)
{
if (Node == NULL)
{
return;
}
PNODE v1 = (*Node)->Right;
if (v1 == NULL)
{
return;
}
(*Node)->Right = v1->Left;
v1->Left = (*Node);
(*Node) = v1;
}
LR型调整
void LR_Rotate(PPNODE Node)
{
RR_LRotate(&(*Node)->Left);
LL_RRotate(Node);
}
RL型调整
void RL_Rotate(PPNODE Node)
{
LL_RRotate(&(*Node)->Right);
RR_LRotate(Node);
}
代码示例
#include<Windows.h>
#include<tchar.h>
#include<iostream>
#include<math.h>
using namespace std;
/*
平衡二叉树的操作(节点高度 单旋 双旋 节点添加 节点删除 节点查找)
*/
#ifndef Max
#define Max(a,b) ((a)>(b)?(a):(b))
#endif // !Max
typedef struct _NODE_
{
int DataValue;
_NODE_ *Left;
_NODE_ *Right;
}NODE,*PNODE,**PPNODE;
PNODE SearchNode(PNODE Node, int DataValue);
BOOL InsertNode(PPNODE Node, int DataValue);
void LL_RRotate(PPNODE Node);
void RR_LRotate(PPNODE Node);
void LR_Rotate(PPNODE Node);
void