c++ 删除二叉树的子树_平衡二叉树
二叉樹
滿二叉樹
完全二叉樹
樹的深度:從根節(jié)點開始(其深度為0)自頂向下逐層累加的。上圖中,13的深度是1,30的深度是2,28的深度是3。(圖中第0層應(yīng)為第一層)
樹的高度:從葉子節(jié)點開始(其高度為0)自底向上逐層累加的。54的高度是2,根節(jié)點23的高度是3。(圖中第0層應(yīng)為第一層)
對于樹中相同深度的每個節(jié)點來說,它們的高度不一定相同,這取決于每個節(jié)點下面的葉子節(jié)點的深度。上圖中,13和54的深度都是1,但是13的高度是1,54的高度是2。
定義
平衡二叉樹也叫自平衡二叉搜索樹(Self-Balancing Binary Search Tree),所以其本質(zhì)也是一顆二叉搜索樹,不過為了限制左右子樹的高度差,避免出現(xiàn)傾斜樹等偏向于線性結(jié)構(gòu)演化的情況,所以對二叉搜索樹中每個節(jié)點的左右子樹作了限制,左右子樹的高度差稱之為平衡因子,樹中每個節(jié)點的平衡因子絕對值不大于
,此時二叉搜索樹稱之為平衡二叉樹。自平衡是指,在對平衡二叉樹執(zhí)行插入或刪除節(jié)點操作后,可能會導(dǎo)致樹中某個節(jié)點的平衡因子絕對值超過
,即平衡二叉樹變得“不平衡”,為了恢復(fù)該節(jié)點左右子樹的平衡,此時需要對節(jié)點執(zhí)行旋轉(zhuǎn)操作。情景分析
當(dāng)插入一個元素使平衡二叉樹不平衡時,可能出現(xiàn)以下的四種情況:
例如,在上面LL情況中,由于"根節(jié)點(8)的左子樹(4)的左子樹(2)還有非空子節(jié)點",而"根節(jié)點(8)的右子樹(12)沒有子節(jié)點";導(dǎo)致"根節(jié)點(8)的左子樹(4)高度"比"根節(jié)點(8)的右子樹(12)"高2。
例如,在上面LR情況中,由于"根節(jié)點(8)的左子樹(4)的左子樹(6)還有非空子節(jié)點",而"根節(jié)點(8)的右子樹(12)沒有子節(jié)點";導(dǎo)致"根節(jié)點(8)的左子樹(4)高度"比"根節(jié)點(8)的右子樹(12)"高2。
例如,在上面RL情況中,由于"根節(jié)點(8)的右子樹(12)的左子樹(10)還有非空子節(jié)點",而"根節(jié)點(8)的左子樹(4)沒有子節(jié)點";導(dǎo)致"根節(jié)點(8)的右子樹(12)高度"比"根節(jié)點(8)的左子樹(4)"高2。
例如,在上面RR情況中,由于"根節(jié)點(8)的右子樹(12)的右子樹(14)還有非空子節(jié)點",而"根節(jié)點(8)的左子樹(4)沒有子節(jié)點";導(dǎo)致"根節(jié)點(8)的右子樹(12)高度"比"根節(jié)點(8)的左子樹(4)"高2。
下面根據(jù)上面的四種情況來具體看修復(fù)的辦法。
LL旋轉(zhuǎn)
當(dāng)平衡二叉樹失去平衡,顯示出上面LL的情況時,可以用下面的一次調(diào)整使其恢復(fù)平衡。
從上圖看出,只需要將高度較大的左子樹的根節(jié)點作為其父節(jié)點,然后,將其父節(jié)點作為右子樹的根節(jié)點;這時,原來左子樹的右子樹需要移動到現(xiàn)在的右子樹下,作為其左子樹。
RR旋轉(zhuǎn)
當(dāng)平衡二叉樹失去平衡,顯示出上面RR的情況時,可以用下面的一次調(diào)整使其恢復(fù)平衡。
從上圖看出,只需要將高度較大的右子樹的根節(jié)點作為其父節(jié)點,然后,將其父節(jié)點作為左子樹的根節(jié)點;這時,原來右子樹的左子樹需要移動到現(xiàn)在的左子樹下,作為其右子樹。
LR旋轉(zhuǎn)
當(dāng)平衡二叉樹失去平衡,顯示出上面LR的情況時,可以用下面的兩次調(diào)整使其恢復(fù)平衡。
如上圖,先將k1為樹根的子樹向左旋轉(zhuǎn),即和前面的RR調(diào)整的方向類似,然后在將以k3為樹根的子樹向右旋轉(zhuǎn)。
RL旋轉(zhuǎn)
當(dāng)平衡二叉樹失去平衡,顯示出上面RL的情況時,可以用下面的兩次調(diào)整使其恢復(fù)平衡。
如上圖,先將k3為樹根的子樹向右旋轉(zhuǎn),即和前面的LL調(diào)整的方向類似,然后在將以k1為樹根的子樹向左旋轉(zhuǎn)。
性能分析
因為平衡二叉樹也是二叉搜索樹,回顧二叉搜索樹中的操作復(fù)雜度,查詢、插入和刪除復(fù)雜度均為 。平衡二叉樹中查詢復(fù)雜度影響因素自然為樹的高度;插入節(jié)點操作可以拆分為兩個步驟:查詢節(jié)點位置,插入節(jié)點后平衡操作;刪除節(jié)點操作同理可以拆分為兩個步驟:查詢節(jié)點位置,刪除節(jié)點后平衡操作。 平衡調(diào)節(jié)過程中可能存在旋轉(zhuǎn)操作,遞歸執(zhí)行的次數(shù)則依賴于樹的高度(可以優(yōu)化為當(dāng)前節(jié)點平衡因子不發(fā)生變化,則取消向上遞歸)。所以平衡二叉樹中查詢、插入和刪除節(jié)點操作的復(fù)雜度依賴于樹高。代碼
給定一個二叉樹,判斷它是否是高度平衡的二叉樹。
class總結(jié)
以上是生活随笔為你收集整理的c++ 删除二叉树的子树_平衡二叉树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python怎么调用文件_python
- 下一篇: c++ 线程什么时候run_阿里后端Ja