1. 程式人生 > >演算法導論 之 平衡二叉樹

演算法導論 之 平衡二叉樹

/******************************************************************************
 **函式名稱: avl_lr_balance
 **功    能: LR型平衡化處理 - 先左旋轉 再向右旋轉(內部介面)
 **輸入引數: 
 **     tree: 平衡二叉樹
 **     node: 左邊失去平衡的結點
 **輸出引數: NONE
 **返    回: AVL_SUCCESS:成功 AVL_FAILED:失敗
 **實現描述: 
 ** 場景1: LL型
 **              A                  B
 **             / \                / \
 **            B   C      ->      BL  A
 **           / \                /   / \
 **          BL BR              X   BR  C
 **         /
 **        X
 **             (1)                (2)
 ** 說明: 結點A是失衡結點,此時當結點B的平衡因子為1時,可判斷為LL型。
 ** 場景2: LR型
 **              A                    C
 **             / \                /     \
 **            B  AR      ->      B       A
 **           / \                / \     / \
 **          BL  C              BL CL   CR AR
 **             / \
 **            CL CR
 **             (1)                (2)
 ** 說明: 結點A是失衡結點,此時當結點B的平衡因子為-1時,可判斷為LR型。
 **       雖然此時結點C的平衡因子的值可能為:-1, 0, 1. 
 **       但旋轉處理的方式是一致的,只是旋轉之後的平衡因子不一致.
 **注意事項: 
 **     1. 圖(1)中A表示左邊失衡的結點 圖(2)表示平衡處理的結果
 **作    者: # Qifeng.zou # 2013.12.13 #
 ******************************************************************************/
int avl_lr_balance(avl_tree_t *tree, avl_node_t *node)
{
    avl_node_t *lchild = node->lchild,
        *parent = node->parent, *lrchild = NULL;


    lrchild = lchild->rchild;
    switch(lrchild->bf) {
        case AVL_LH:
        {
            node->bf = AVL_RH;
            lchild->bf = AVL_EH;
            lrchild->bf = AVL_EH;
            break;
        }
        case AVL_EH:
        {
           node->bf = AVL_EH;
           lchild->bf = AVL_EH;
           lrchild->bf = AVL_EH;
           break;
        }
        case AVL_RH:
        {
            node->bf = AVL_EH;
            lchild->bf = AVL_LH;
            lrchild->bf = AVL_EH;
            break;
        }
    }

    avl_set_rchild(lchild, lrchild->lchild);
    avl_set_lchild(lrchild, lchild);
    avl_set_lchild(node, lrchild->rchild);
    avl_set_rchild(lrchild, node); 

    avl_instead_child(tree, parent, node, lrchild);

    return AVL_SUCCESS;
}
程式碼14 LR型平衡化處理(內部介面)