日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

c++ 删除二叉树的子树_平衡二叉树

發(fā)布時間:2023/12/15 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ 删除二叉树的子树_平衡二叉树 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

二叉樹

  • 二叉數(shù)是每個節(jié)點最多有兩個子樹,或者是空樹(n=0),或者是由一個根節(jié)點及兩個互不相交的,分別稱為左子樹和右子樹的二叉樹組成。
  • 滿二叉樹

  • 有兩個非空子樹(二叉樹中的每個結(jié)點恰好有兩個孩子結(jié)點切所有葉子結(jié)點都在同一層)。
  • 也就是一個結(jié)點要么是葉結(jié)點,要么是有兩個子結(jié)點的中間結(jié)點。
  • 深度為k且含有2^k-1個結(jié)點的二叉樹。
  • 完全二叉樹

  • 從左到右依次填充。
  • 從根結(jié)點開始,依次從左到右填充樹結(jié)點。
  • 除最后一層外,每一層上的所有節(jié)點都有兩個子節(jié)點,最后一層都是葉子節(jié)點。
  • 完全二叉樹是由滿二叉樹而引出來的,若設(shè)二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結(jié)點數(shù)都達到最大個數(shù)(即1~h-1層為一個滿二叉樹),第 h 層所有的結(jié)點都連續(xù)集中在最左邊,這就是完全二叉樹。
  • 通過之前對二叉搜索樹介紹可知,將集合構(gòu)造為二叉搜索樹結(jié)構(gòu),該結(jié)構(gòu)下對樹中節(jié)點的查詢、刪除和插入三種操作,時間復(fù)雜度均為 。影響時間復(fù)雜度的因素即為二叉樹的高,為了盡量避免樹中每層上只有一個節(jié)點的情況,這里引入平衡二叉樹。

    圖中第0層應(yīng)為第一層

    樹的深度:從根節(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é)點后,根節(jié)點的左子樹的左子樹還有非空子節(jié)點,導(dǎo)致"根的左子樹的高度"比"根的右子樹的高度"大2,導(dǎo)致AVL樹失去了平衡。
  • 例如,在上面LL情況中,由于"根節(jié)點(8)的左子樹(4)的左子樹(2)還有非空子節(jié)點",而"根節(jié)點(8)的右子樹(12)沒有子節(jié)點";導(dǎo)致"根節(jié)點(8)的左子樹(4)高度"比"根節(jié)點(8)的右子樹(12)"高2。

  • LR:稱為"左右"。插入或刪除一個節(jié)點后,根節(jié)點的左子樹的右子樹還有非空子節(jié)點,導(dǎo)致"根的左子樹的高度"比"根的右子樹的高度"大2,導(dǎo)致AVL樹失去了平衡。
  • 例如,在上面LR情況中,由于"根節(jié)點(8)的左子樹(4)的左子樹(6)還有非空子節(jié)點",而"根節(jié)點(8)的右子樹(12)沒有子節(jié)點";導(dǎo)致"根節(jié)點(8)的左子樹(4)高度"比"根節(jié)點(8)的右子樹(12)"高2。

  • RL:稱為"右左"。插入或刪除一個節(jié)點后,根節(jié)點的右子樹的左子樹還有非空子節(jié)點,導(dǎo)致"根的右子樹的高度"比"根的左子樹的高度"大2,導(dǎo)致AVL樹失去了平衡。
  • 例如,在上面RL情況中,由于"根節(jié)點(8)的右子樹(12)的左子樹(10)還有非空子節(jié)點",而"根節(jié)點(8)的左子樹(4)沒有子節(jié)點";導(dǎo)致"根節(jié)點(8)的右子樹(12)高度"比"根節(jié)點(8)的左子樹(4)"高2。

  • RR:稱為"右右"。插入或刪除一個節(jié)點后,根節(jié)點的右子樹的右子樹還有非空子節(jié)點,導(dǎo)致"根的右子樹的高度"比"根的左子樹的高度"大2,導(dǎo)致AVL樹失去了平衡。
  • 例如,在上面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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。