確認違規節點的位置
首先我們找到待刪除的節點z,如果節點z的兩個孩子均為空,那麼將其父節點中對應指向z的指標置為空,然後刪除節點z。如果節點z僅有乙個孩子,那麼將z節點的父節點中指向z的指標指向z僅有的孩子,然後刪除節點z。如果節點z有兩個非空的子節點,那麼找到節點z的中序後繼節點y(即右子樹的最左節點),將節點y的key值覆蓋節點z的key值,此時節點y的兩個孩子均為空或者只有乙個右孩子,將節點y的右指標裡的值覆蓋其父節點中指向y的指標,然後刪除節點y。綜上所述,刪除的節點要麼是節點z本身要麼是節點z的中序後繼節點y。我們現在將它們統一命名為x,假若節點x是乙個左孩子就對其父節點p的平衡因子進行減1操作,否則對節點p的平衡因子進行加1操作。如果節點p的平衡因子的絕對值超出了1,那麼節點p即為違規節點,如果p的平衡因子為0,此時表示p的樹高減小了1,這會對上層的節點的平衡因子造成影響(如附圖),此時根據p是乙個左孩子還是右孩子對其父節點的平衡因子進行修改。如果p的平衡因子的絕對值為1,那麼表示原來等高的兩顆子樹,現在其中一顆子樹高度減1了,這節點p的樹高並沒有影響,此時不需要對平衡二叉樹進行調整。bf表示平衡因子。下面是上述判斷的示意圖:
判斷節點p的平衡因子的絕對值是否為1,若是則不需要調整樹形結構,否則進行調整。
附圖:
此時刪除紅色節點會對樹根的平衡因子產生影響。
2.調整二叉樹使之平衡
與平衡二叉樹節點插入的調整方法相同,詳見《平衡二叉樹插入某個節點的方法》博文,不再贅述。
平衡二叉樹插入某個節點的方法
確定違規節點的位置 每個節點z均有乙個稱之為平衡因子bf的域,它用來儲存 左子樹的高度 右子樹的高度 所得的值,合法的取值只有 1,0,1三種,一旦出現其他值則表示以節點z為根的子樹不是一顆平衡樹,此時需要進行調整。根據二叉查詢樹的插入規則找到節點z應該插入的正確的位置,插入後將節點z的平衡因子置為...
平衡二叉樹的刪除
平衡二叉樹的刪除也涉及到刪除後的連線問題。其刪除一般分為4種情況 1 刪除葉子結點 2 刪除左子樹為空,右子樹不為空的結點 3 刪除左子樹不為空,右子樹為空的結點 4 刪除左右子樹都不為空的結點。刪除葉子結點很簡單,直接刪除即可,此處不再贅述。接下來分別學習其他三種刪除情況。左子樹為空,有子樹不為空...
二叉樹的節點刪除
刪除 int treedeletedata pnode proot,int data pnode pfind proot pnode pfather null pnode pdelete null 01找到資料為data的節點的位址以及父節點的位址 while pfind null else if ...