關於平衡二叉樹的理解有一些部落格了,但是我覺得不能很好地理解總是有一些原因的,我自己就代表了一種開始不能理解的原因,所以從自己理解時碰到的問題來解釋下,也加深下自己的印象。
一共4種型別,分別是l-l,l-r,r-r,r-l型,一定要對這個有乙個畫面式的理解,因為我們不可能背**,這4種基礎型別就是我們復現**的最好的依據。這圖是我自己畫的。。。
以下圖來解釋l-r型的意思(其他3種類似)
1在3的左邊(left),2在1的右邊(right),故稱為l-r型
在知道這4種型別後,我們先從簡單型別入手,也就是l-l和r-r型
l-l型,直接對3進行右旋操作
先解釋下右旋的直觀理解,就是3繞著2順時針旋轉。(父節點繞著子節點順時針旋轉)
同樣,對於r-r型,左旋就是1繞著2逆時針旋轉。(父節點繞著子節點逆時針旋轉)
node *rotateright(node *root)
直觀的看到,2的右兒子成了3,要是2本來沒有2兒子還好,如果2本來有右兒子怎麼辦呢?這是矛盾1;
3本來是有左兒子的,那麼現在沒了,3豈不是很難過???這是矛盾2;
馬克思主義說過矛盾可以同歸於盡,這裡我們來感受下馬克思主義哲學的優越性。。。
2多個右兒子,3少個左兒子,怎麼辦呢,2和3一拍即合,2把多出來的右兒子託付給3兒子,真的是2333333
當然了,這只是為了便於理解,但是我們可以發現,這樣子也是符合線索二叉樹的,因為2的右兒子必然比3小,當3的左兒子不虧。
總結:關鍵要理解這裡的託付兒子這一步。
這裡左旋也一樣,本來1有右兒子,現在好像沒了;2本來如果有個左兒子,那這裡被1換後就多出來個左兒子;
那麼,2就把多出來的左兒子拿出來當1的右兒子。
這是先左旋3的左子樹1,形成我們已經解決的l-l型,然後再右旋2節點。
r-l型類似了。
平衡二叉樹建立
time limit 400 ms memory limit 65536 kib include include include struct node int max int a,int b 深度 int deep struct node root struct node ll struct no...
平衡二叉樹例題 平衡二叉樹
acwing 72.平衡二叉樹 思路一 求每個節點的左右子樹深度,根據深度差判斷,直到葉子節點結束,效率不夠高,每個節點都要用兩次計算深度的遞迴函式 思路二 從葉子節點開始,計算深度差,一旦有深度差大於1的,就直接返回0,也不用管上面的深度是不是正確了,畢竟我們只需要true和false兩種狀態,省...
二叉樹 平衡二叉樹
1.題目 給定乙個二叉樹,判斷這棵二叉樹是否是高度平衡的二叉樹 平衡二叉樹 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1 2.題目分析 1 如果乙個節點的兩個子樹的深度之差超過1,則不是平衡二叉樹 2 如果乙個節點的兩個子樹的深度之差不超過1,則是平衡二叉樹 3.程式分析 1 若這棵二...