AvlTree
Insert ( ElementType X, AvlTree T )
{
    if ( T == NULL )
    {
        /* Create and return a one-node tree */
        T = malloc( sizeof( struct AvlNode ) );
        if ( T == NULL )
            FatalError( "Out of space!!!" );
        else
        {
            T->Element = X; T->Height = 0;
            T->Left = T->Right = NULL;
        }
    }
    else
    if ( X < T->Element )
    {
        T->Left = Insert( X, T->Left );
        if ( Height( T->Left ) - Height( T->Right ) == 2 )
            if ( X < T->Left->Element )
                T = SingleRotateWithLeft( T );
            else
                T = DoubleRotateWithLeft( T );
    }
    else
    if ( X > T->Element )
    {
        T->Right = Insert( X, T->Right );
        if ( Height( T->Right ) - Height( T->Left ) == 2 )
            if ( X > T->Right->Element )
                T = SingleRotateWithRight( T );
            else
                T = DoubleRotateWithRight( T );
    }
    /* Else X is in the tree already;we'll do nothing */
    T->Height = Max( Height( T->Left ), Height( T->Right ) ) + 1;
    return T;
}
为什么会有`if ( X < T->Left->Element )`这个判断语句,T->left->Element不就是新插入节点的Element吗,那么它跟X不是相同的吗
|  |      1illuz      2015-04-23 09:01:35 +08:00 `T->Right = Insert( X, T->Right );` 这句话是递归调用,最后插入的 X 会在 (T->Right) 子树叶子节点,或者树中已存在就不插入了,而不是一定插在 (T->Right) 子树的根节点。 所以插入后的 (T->left->Element) 并不一定是新插入节点,它跟 X 可能不是相同的。 | 
|  |      2illuz      2015-04-23 09:04:40 +08:00 复制语句复制得有点混乱,再来一次。 >.< 先看看前一句的:`T->Left = Insert( X, T->Left );` 这句话是递归调用 Insert 函数,而不是就直接插进去。 最后插入的 X 会在 (T->Left) 子树叶子节点,或者树中已存在就不插入了,而不是一定插在 (T->Left) 子树的根节点。 所以插入后的 (T->left->Element) 并不一定是新插入节点,它跟 X 可能不是相同的。 | 
|  |      3insaneDream OP @illuz `T->Right = Insert( X, T->Right );`,如果T->Right==NULL的,那么它就会创建一个新的节点并返回给T->Right, 那么插入的X不是在T->Right这个节点上吗? |