1)、ll:leftleft,也稱為"左左"。插入或刪除乙個節點後,根節點的左子樹的左子樹還有非空子節點,導致"根的左子樹的高度"比"根的右子樹的高度"大2,導致**l樹失去了平衡。
例如,在下面ll情況中,由於"根節點(10)的左子樹(5)的左子樹(4)還有非空子節點",而"根節點(10)的右子樹(20)沒有子節點";導致"根節點(10)的左子樹(5)高度"比"根節點(10)的右子樹(20)"高2。
解決辦法如下圖的旋**
對於(10)號的左子樹(5)也可能沒有右子樹(6)。那麼從左圖到右圖的具體過程有哪些?
對於(5)號有:父親節點需要改變;右子樹需要改變。
對於(10)號有:父親節點需要改變;左子樹需要改變。
對於(6)號有:父親節點需要改變。
另外高度需要調整。
具體過程是:第一,先儲存(5)號節點;第二,截斷(5)號的右子樹(6)給(10)號的左子樹;第三,將(10)號作為(5)號的右子樹。
左左情況:一是:左左左,二是左左右。這兩種情況可以合併處理,和上面處理完全一樣。
2、左右情況。一是左右左,二是左右右。
3、rr的情況。
4、右左情況:一是右左左,二是右左右。以下分別是第
一、第二種情況,可以合併操作。
下圖的第三個樹有乙個地方畫錯了,節點45應該是節點20的右孩子,而圖中畫成節點50的左孩子了。
**分析:節點資訊如下:其中parent成員是多餘的,可以去掉。
思路:遞迴找到插入點,並插入節點。再原路返回根節點過程中判斷遞迴路徑中所有節點的左右子樹的高度差是否達到2,若達到則根據型別來調整,並更新路徑中所有節點的高度。
ll旋轉**如下:
一、思想:分類討論
二、二叉搜尋樹的刪除操作具體討論分如下四種情況:(記我們要刪除的節點為d)
1、如果d節點既沒有左孩子,也沒有右孩子,那麼直接刪除就好了;
2、如果d節點只有左孩子,沒有右孩子,那麼只需要把該d節點左孩子鏈結到d節點的父親節點,然後刪除d節點就好了;
3、如果d節點只有右孩子,沒有左孩子,那麼只需要把該d節點右孩子鏈結到d節點的父親節點,然後刪除d節點就好了;
4、如果d節點既有左孩子,又有右孩子,那麼需要找到d節點的右子樹的最小值節點,找到之後直接替換掉d節點,然後刪除找到的最小值節點就好了。(解釋:因為d節點有左右兩個孩子節點,很顯然d節點的左子樹中的所有節點值都小於d節點的值,d節點的右子樹中的所有節點的值都大於d節點的值,這個是根據二叉搜尋樹的定義得到的結論。那麼現在d要被刪除,那麼d被刪除之後誰可以來替換它的位置呢?顯然只能是d的右子樹的最小值可以勝任,因為它既滿足大於d節點的左子樹中的所有節點值,因為d的右子樹的所有節點值都大於d的左子樹的節點值;同時也滿足小於d的右子樹中所有的其他節點值,因為d是右子樹中最小的值,當然小於d的右子樹中所有其他節點值了)
三、圖例說明:
1、第一種情況:這種情況其實就是葉子節點的刪除,反正它絕代了,刪除了就刪除了,多他不多,少它不少。比如刪除下圖中的21號元素,它既沒有左孩子,也沒有右孩子,直接將其父節點指向它的鏈結刪除就行了。
2、第二種情況:刪除10號節點,該節點只有左孩子,沒有右孩子。只需要三步即可,刪除10號節點指向其5號左子樹的鏈結,刪除10號節點的父節點15號指向她的鏈結,將10號節點的父節點15號的左鏈結指向10號的5號左子樹。
3、第三種情況:刪除40號節點,該節點只有右孩子,沒有左孩子。只需要三步即可,刪除40號節點指向其50號右子樹的鏈結,刪除40號節點的父節點30號指向她的鏈結,將40號節點的父節點30號的右鏈結指向40號的50號右子樹。
4、第四種情況:刪除20號節點,因為他既有左孩子,又有右孩子。所以先找到20號節點的右子樹中所有節點中的最小值為21號,其實右子樹的最小值就是在右子樹的最左邊的那個節點;找到替換節點21號後就可以進行下一步操作了,如下圖,20號需的父節點指向的鏈結改變為指向21號,20的左右孩子鏈結也需要替換,21號原來的父節點指向需要刪除。
當然了,還可以找出30號的左子樹中的所有節點的最大值來替換該20號節點。方法差不多,要替換乙個節點,就去找左子樹中最靠近他的節點,或者到他的右子樹中最靠近他的節點,其實就是節點的前驅節點和後驅節點。
這裡需要了解兩個概念,叫「前驅」和「後繼」。分別是樹中小於它的最大值和大於它的最小值,如果把樹結構中的所有節點按順序拍好的話,它的前驅和它的後繼兩個節點剛好在它左右緊挨著它。當乙個節點被刪除時,為了保證二叉樹的結構不被破壞,要讓它的前驅或者後繼節點來代替它的位置,然後將它的前驅或者後繼節點同樣做刪除操作。
那麼怎樣找前驅或者後繼呢。小於它的最大值,就是在樹中在它左子樹中最靠右的那個節點。同樣,大於它的最小值,就是在它右子樹中最靠左的那個節點。當乙個節點既有左子節點又有右子節點時,前驅就是它的左子節點的右子節點的右子節點...直到最右子節點;後繼就是它的右子節點的左子節點的左子節點...直到最左子節點。
平衡二叉樹例題 平衡二叉樹
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。每行是...