確定違規節點的位置
每個節點z均有乙個稱之為平衡因子bf的域,它用來儲存(左子樹的高度-右子樹的高度)所得的值,合法的取值只有-1,0,1三種,一旦出現其他值則表示以節點z為根的子樹不是一顆平衡樹,此時需要進行調整。
根據二叉查詢樹的插入規則找到節點z應該插入的正確的位置,插入後將節點z的平衡因子置為0,此時節點z給它的父節點產生了乙個增量,如果節點z是左孩子那麼對父節點的平衡因子進行加1操作,否則進行減1操作,如果此時父節點的平衡因子的值非0,那麼它又對它的父節點產生乙個增量,重複以上步驟直到找到第乙個違規節點的位置,此時違規節點的平衡因子的絕對值大於1,為了描述方便我們將違規節點命名為節點a。上述判斷流程如下:
退出後判斷節點z的父節點的平衡因子是否為0,若是則此樹已經平衡,否則父節點即為違規節點。
2.調整二叉樹使之平衡
違規節點為a,節點a的左孩子為b,右孩子為c。分下面幾種情況進行調整:
(1).節點a的平衡因子為2
(i).節點b的平衡因子為1,如圖所示:
設節點a的高度為h,那麼節點b的高度為h-1.當節點b的平衡因子為1時,那麼lb的高度為h-2,rb的高度為h-3,此時節點c的高度為h-3.在這種情況下將節點a右旋即可。變換後節點a和節點b的平衡因子均變為0。
(ii).節點b的平衡因子為-1,如圖所示:
由於b的平衡因子為-1,所以節點b必定有乙個右孩子,先對節點b進行左旋變成第二幅圖,然後對節點a進行右旋。由於rb節點的兩個孩子l和r的樹高要麼為h-3,要麼為h-4,但是不會同時為h-4。根據節點r的樹高調整節點a的平衡因子,根據節點l的樹高調整節點b的平衡因子,節點rb的平衡因子為0.
(2).節點a的平衡因子為-2
(i).節點c的平衡因子為1
由於節點c的平衡因子為1,所以節點c必定存在乙個左孩子。首先將節點c進行右旋,然後對節點a進行左旋。根據節點l調整節點a的平衡因子,根據節點r調整節點c的平衡因子,節點lc的平衡因子變為0.
(ii).節點c的平衡因子為-1,如圖所示:
在這種情況下,只需要將節點c進行左旋即可完成轉換。變換後節點a和節點c的平衡因子均變為0。
平衡二叉樹刪除某個節點的方法
確認違規節點的位置 首先我們找到待刪除的節點z,如果節點z的兩個孩子均為空,那麼將其父節點中對應指向z的指標置為空,然後刪除節點z。如果節點z僅有乙個孩子,那麼將z節點的父節點中指向z的指標指向z僅有的孩子,然後刪除節點z。如果節點z有兩個非空的子節點,那麼找到節點z的中序後繼節點y 即右子樹的最左...
平衡二叉樹例題 平衡二叉樹
acwing 72.平衡二叉樹 思路一 求每個節點的左右子樹深度,根據深度差判斷,直到葉子節點結束,效率不夠高,每個節點都要用兩次計算深度的遞迴函式 思路二 從葉子節點開始,計算深度差,一旦有深度差大於1的,就直接返回0,也不用管上面的深度是不是正確了,畢竟我們只需要true和false兩種狀態,省...
二叉樹 平衡二叉樹
1.題目 給定乙個二叉樹,判斷這棵二叉樹是否是高度平衡的二叉樹 平衡二叉樹 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1 2.題目分析 1 如果乙個節點的兩個子樹的深度之差超過1,則不是平衡二叉樹 2 如果乙個節點的兩個子樹的深度之差不超過1,則是平衡二叉樹 3.程式分析 1 若這棵二...