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