平衡二叉樹的建立(上)

2021-08-29 01:55:52 字數 1391 閱讀 1344

關於平衡二叉樹的理解有一些部落格了,但是我覺得不能很好地理解總是有一些原因的,我自己就代表了一種開始不能理解的原因,所以從自己理解時碰到的問題來解釋下,也加深下自己的印象。

一共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 若這棵二...