平衡二叉樹的刪除也涉及到刪除後的連線問題。其刪除一般分為4種情況:
1)刪除葉子結點;
2)刪除左子樹為空,右子樹不為空的結點:
3)刪除左子樹不為空,右子樹為空的結點;
4)刪除左右子樹都不為空的結點。
刪除葉子結點很簡單,直接刪除即可,此處不再贅述。接下來分別學習其他三種刪除情況。
左子樹為空,有子樹不為空
以圖中的平衡二叉樹為例。
現要刪除結點105,結點105有右子樹,沒有左子樹,則刪除後,只需要將其父結點與其右子樹連線即可。
刪除結點會使相應子樹的高度減小,可能會導致樹失去平衡,如果刪除結點後使樹失去平衡,要調整最小不平衡子樹使整棵樹達到平衡。插入和刪除一樣,在刪除的過程中要時刻保持樹的平衡性。
做子樹不為空,右子樹為空
要刪除乙個結點,結點有左子樹沒有右子樹,這種情況與上一種情況相似,只需要將其父結點與其左子樹連線即可。例如要刪除圖中的結點100,其刪除過程如圖所示:
左右子樹均不為空
如果要刪除的結點既有左子樹又有右子樹,則要分情況進行討論。
(1)如果該結點x的平衡因子為0或者1 ,找到其左子樹中具有最大值的結點max,將max的內容與x的元素進行交換,則max即為要刪除的結點。由於樹是有序的,因此找到的max結點只可能是乙個葉子結點或者乙個沒有右孩子的結點。
例如現在有一棵平衡二叉樹。現在要刪除結點20,結點20的平衡因子是1,則在其左子樹中找到最大結點15,將兩個結點的數值互換。
然後刪除結點20。
在刪除結點20之後,平衡二叉樹失去了平衡,結點10的平衡因子為2,則需要對此最小不平衡子樹進行調整,此次調整類似於插入,先進性一次左旋轉再進行一次右旋轉即可,調整後的結果如圖:
(2)如果要刪除的結點其平衡因子為-1,則找到其右結點中具有最小值的結點min,將min與x的資料值進行互換,則min即為新的要刪除的結點,將結點刪除後,如果樹失去了平衡,則需要重新調整。由於平衡二叉樹是有序的,因此這樣的結點只可能是乙個葉子結點,或者是乙個沒有左子樹的結點。
平衡二叉樹例題 平衡二叉樹
acwing 72.平衡二叉樹 思路一 求每個節點的左右子樹深度,根據深度差判斷,直到葉子節點結束,效率不夠高,每個節點都要用兩次計算深度的遞迴函式 思路二 從葉子節點開始,計算深度差,一旦有深度差大於1的,就直接返回0,也不用管上面的深度是不是正確了,畢竟我們只需要true和false兩種狀態,省...
二叉樹 平衡二叉樹
1.題目 給定乙個二叉樹,判斷這棵二叉樹是否是高度平衡的二叉樹 平衡二叉樹 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1 2.題目分析 1 如果乙個節點的兩個子樹的深度之差超過1,則不是平衡二叉樹 2 如果乙個節點的兩個子樹的深度之差不超過1,則是平衡二叉樹 3.程式分析 1 若這棵二...
平衡二叉樹
平衡二叉樹 time limit 1000 ms memory limit 32768 kb submit 16 6 users accepted 6 6 users 所謂平衡 二叉樹就是 水星文,若看不懂請跳轉到下一題 你的任務判斷輸入的二叉樹是否為平衡二叉樹,是則輸出yes,否則輸出no。每行是...