平衡二叉树的插入方法
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值,根据不同情况不同处理:

  1. 是EH时,表示当前结点下是平衡的,插入了一个左边的值,则让bf=LH就行了,taller设为true往上传递

  2. 是LH时,表示在左边高的时候又加了一层,则需要左平衡一下,平衡完后taller就为false

  3. 是RH时,表示右边高的时候在左边加了一层,那不就平衡了吗,设bf为EH,taller也为false


首页 我的博客
粤ICP备17103704号