static bool InsertAVLTree(ref Node node, int data, ref bool taller)
{
if (node == null)
{
node = new Node();
node.bf = EH;
node.data = data;
taller = true;
return true;
}
else {
if (data == node.data)
{
taller = false;
return false;
}
if (data < node.data)
{
if (!InsertAVLTree(ref node.cLeft, data, ref taller))
{
return false;
}
if (taller)
{
switch (node.bf)
{
case EH:
node.bf = LH;
taller = true;
break;
case LH:
LeftBalance(ref node);
taller = false;
break;
case RH:
node.bf = EH;
taller = false;
break;
default:
break;
}
}
}
else
{
if (!InsertAVLTree(ref node.cRight, data, ref taller))
{
return false;
}
if (taller)
{
switch (node.bf)
{
case EH:
node.bf = RH;
taller = true;
break;
case LH:
node.bf = EH;
taller = false;
break;
case RH:
RightBalance(ref node);
taller = false;
break;
default:
break;
}
}
}
}
return true;
}使用递归的方式,使用一个taller标识符来确认是否需要去判断要不要进行检查平衡操作。
插入成功之后,就设为true,然后程序玩下执行判断是否需要进行平衡操作,这里讲一下左插入的操作,右边的差不多。
当左插入成功后,就判断原结点的bf值,根据不同情况不同处理:
是EH时,表示当前结点下是平衡的,插入了一个左边的值,则让bf=LH就行了,taller设为true往上传递
是LH时,表示在左边高的时候又加了一层,则需要左平衡一下,平衡完后taller就为false
是RH时,表示右边高的时候在左边加了一层,那不就平衡了吗,设bf为EH,taller也为false