平衡二叉樹 AVL 實現(3)

2021-06-17 18:03:27 字數 1534 閱讀 6244

現象1

注意:q是30,而不是20,因為刪除了25,節點會移動,以下現象均遵循此規律

現象2

現象3

現象1和現象2比較簡單,不需要平衡化處理,現象3則比較複雜.先討論現象1和2

先找到節點,然後刪除節點

private 

node findnode(int value)

if (value < node.data)

else

}return null;

}public bool remove(int value)

return false;

}

其刪除節點的子節點<2個,即只有左節點或者右節點或者沒節點三種可能如果刪除的是右節點,那麼該刪除節點的子節點(如果有的話)將會代替該節點,反之也則替換左節點

代替的節點不是左節點就是右節點(只會是其中乙個,若是兩個子節點的情況則另外考慮)

var tmp = node.left;

if (tmp == null)

if (currentindex > 0)

else

}else

即該節點的平衡因子為0,說明其左子樹和右子樹的高度是相同的

刪除該節點後,其左節點代替父節點

但程式的做法沒有我們看到這麼簡單

將左節點的值賦給父節點,然後將父節點的左節點以其原有左節點的左節點進行替換(即將15的值換成12,將15的左子節點換成12的左子節點,由於12沒有左子節點,所以12的左子節點為空),程式如下

private void removenode(node node)

}

現象3和現象2方式前期處理方式相同,但是由於其左子樹和右子樹的高度不同導致了平衡因子出現2或-2的情況,後期還要進行處理,即是對於平衡因子的處理

還是一樣,當刪除左節點時(父節點和某些祖父節點的)平衡因子-1,反之則+1

現象1則+1

現象2則-1

現象3則是父和祖父均-1

當平衡因子絕對值變成2了,則進行旋轉

平衡二叉樹 AVL

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

平衡二叉樹(AVL樹)

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

平衡二叉樹 AVL 實現 2

繼續討論旋轉 為了方便討論是做點記號 x為插入的節點p為旋轉軸 p有時候為x的父節點如ll,rr旋轉 p有時候也為x,如lr,rl旋轉 r為平衡因子絕對值 2的節點 看下面四種情況 當三個節點處於一條直線,並均是左節點時,需要以中間的節點為旋轉軸向右側 順時針 旋轉一次 使得c成為b的右子節點 b代...