AVL二叉搜尋樹的Rotation

2021-07-28 20:14:57 字數 1457 閱讀 4107

當x位於a的左子樹的左子樹時,執行ll。首先定義left為a的左子節點。將a的左指標指向left的右子節點;left的右指標指向a;將a的父節點指向a的指標指向left;在ll之後,將a和left的balance factor都設為0.其他節點的balance factors均不做改變。

當x位於a的左子樹的右子樹時,執行lr。首先定義left為a的左子節點,將grandchild定義為left的右孩子。將left的右指標指向grandchild的左子節點;grandchild的左指標指向left;將a的左指標指向grandchild的右孩子;將grandchild的右孩子變成a,將a的父節點指向a的指標指向grandchild;在lr之後,修改balance factor需要根據源數作3中情況考慮:

1.如果開始的時候grandchild的factor為+1, 則將a的factor設為-1,left的factor設為0。

2.如果開始的時候grandchild的factor為0,則將a和left的factor均設為0

3.如果開始的時候grandchild的factor為-1,則將a的factor設為0,left的factor設為+1.

最後,所有case的grandchild的factor均設為0

當x位於a的右子樹的右子樹時,執行rr。首先定義right為a的右子節點。將a的右指標指向right的左子節點;right的左指標指向a;將a的父節點指向a的指標指向right;在rr之後,將a和left的balance factor都設為0.其他節點的balance factors均不做改變。

當x位於a右子樹的左子樹時。rl與lr對稱。定義right為a的右孩子,grandchild為right的左孩子。將right的左孩子變成granchild的右孩子,gandchild的右孩子變為right;a的右孩子變成grandchild的左孩子,grandchild的左孩子變成a,最後將a的父節點指向a的指標指向grandchild。

同理factor的取值視3種情況而定:

1.如果開始的時候grandchild的factor為+1, 則將a的factor設為0,right的factor設為-1。

2.如果開始的時候grandchild的factor為0,則將a和left的factor均設為0

3.如果開始的時候grandchild的factor為-1,則將a的factor設為+1,left的factor設為0.

最後,所有case的grandchild的factor均設為0

平衡二叉樹 AVL

平衡二叉樹在查詢中經常用到。由於平衡二叉樹是一種平衡的二叉排序樹,所以其建立方法必須要遵守二叉排序樹的規則,即每個新插入的節點是乙個葉子節點。它左右子樹高度差不超過1,並且要求左右子樹也是平衡二叉樹,並且左子樹的節點最大值小於根節點,右子樹節點最小值大於根節點。1 高度為log n 2 平均查詢長度...

平衡二叉樹(AVL樹)

左右子樹高度之差的絕對值不超過1,左右子樹高度之差稱為該結點的平衡因子。通過對樹的結構進行調整,使樹的高度在每次插入結束後仍能保持o logn 的級別。引入變數height來記錄高度struct node 新建乙個結點 1.申請變數空間 2 初始結點權值,高度 1 3 初始左右孩子為空 4 返回新建...

二叉平衡樹(AVL)的插入

這次節點的資料域增加了高度這個量,用來計算平衡因子,以此在插入的時候來調整樹的結構 節點 struct node 構造新節點 node newnode int v 獲取樹高 int getheight node root 計算平衡因子 int getbalancefactor node root 更...