演算法導論 之 平衡二叉樹
阿新 • • 發佈:2018-12-25
程式碼14 LR型平衡化處理(內部介面)/****************************************************************************** **函式名稱: 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; }