二叉樹13 平衡二叉樹

2021-07-31 08:44:30 字數 1912 閱讀 7926

題目:輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。

思路:所謂平衡二叉樹是指空樹或者任意結點的2棵子樹的高度差不差過1的樹。要判斷以root為根的樹是否是一棵平衡二叉樹,需要先判斷以root.left為根的子樹和以root.right為根的子樹是否是平衡二叉樹,如果有某一棵子樹不是平衡二叉樹那麼整棵二叉樹root就不是平衡二叉樹,如果2棵子樹都是平衡的,那麼求2棵子樹的高度的差值是否》1,如果大於1就是不平衡,否則就是平衡的。即要求root樹需要先求其left和right子樹,因此顯然應該是對二叉樹的後序遍歷遞迴進行改造即可。

設計乙個遞迴函式時需要考慮每次這個函式執行時需要輸入什麼資訊,於是上一次呼叫時就需要收集什麼資訊,收集的資訊可以如果只有乙個,那麼可以隨著return進行傳遞,如果有多個資訊,那麼可以放入到陣列中進行傳遞,或者將這些變數做成成員變數,此時不需要顯式地傳遞,上一次遞迴呼叫對變數產生的影響會會自動在當前遞迴執行時產生影響。

設計乙個遞迴函式,輸入乙個根結點root,判斷這棵樹是否是平衡二叉樹,由於每次呼叫遞迴需要使用2個資訊,乙個是上一棵子樹是否平衡true/false,另乙個是上一棵子樹的長度length,由於需要收集2個值,因此不能直接return。解決方法:①顯然可以特殊的,當子樹不是平衡二叉樹時返回-1,否則是平衡二叉樹就返回樹的高度,這樣就只要返回乙個int型別的值就可以了;②設定乙個遞迴方法所在類的成員變數flag,用來標識一棵樹是否是平衡的,在遞迴方法中,如果處理後發現新的樹不是平衡的,就將flag設定為false,否則就設定為true,當遞迴方法執行時,先對子樹進行平衡判斷,就檢查這個變數即可,如果是true就是平衡的,否則就是不平衡的。這2種方法都可以,練習時使用第二種方法。其實也可以沒有返回值,將樹的高度height也設定為成員變數,這並不會受到遞迴的影響。

//判斷一棵樹是否是平衡二叉樹,使用後序遍歷的遞迴實現即可

public class solution

//遞迴方法,判斷一棵二叉樹是否是平衡的,將結果設定給falg變數並返回這棵樹的高度(深度,長度)

private void process(treenode root)

//①先處理左子樹

this.process(root.left);

int leftheight=height;

if(!flag)

//②處理右子樹

this.process(root.right);

int rightheight=height;// 2

if(!flag)

//左右子樹平衡:

//注意,由於height是所有方法共享的,因此在每次方法呼叫後要及時將其取出,否則在下乙個方法呼叫時會將其覆蓋

if((math.abs(leftheight-rightheight))>1)else

}}

f1:注意:遞迴方法一定要有邊界條件,所謂邊界條件就是指出遞迴方法合適return,因此邊界條件的處理就是將其return,可以有返回值也可以沒有返回值。

f2:在遞迴中,不同層次的遞迴呼叫之間的引數傳遞可以通過類的成員變數或者全域性變數來實現,每次呼叫遞迴方法就認為對成員變數height,flag進行了賦值,於是在遞迴方法中可以直接使用這些變數,這些變數是被遞迴方法處理過後的值,但是千萬注意,如果有2個遞迴呼叫方法,如上面的遞迴1:this.process(root.left);和遞迴2:this.process(root.right);那麼當遞迴1執行後就認為這個遞迴函式完全執行完成了,不要將其展開來理解,於是此時的flag,height是遞迴1處理過後的值,但是當執行遞迴2後,flag和height就被新的值覆蓋了,而此時需要在遞迴1和遞迴2執行結束後使用2個height進行比較,顯然只存在了最後覆蓋的那個值,因此必須在每次遞迴呼叫後,下一次遞迴呼叫之前將全域性變數賦值給定義的區域性變數進行保持,這樣就算全域性變數被覆蓋了,也不要緊。

二叉樹 平衡二叉樹

1.題目 給定乙個二叉樹,判斷這棵二叉樹是否是高度平衡的二叉樹 平衡二叉樹 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1 2.題目分析 1 如果乙個節點的兩個子樹的深度之差超過1,則不是平衡二叉樹 2 如果乙個節點的兩個子樹的深度之差不超過1,則是平衡二叉樹 3.程式分析 1 若這棵二...

平衡二叉樹例題 平衡二叉樹

acwing 72.平衡二叉樹 思路一 求每個節點的左右子樹深度,根據深度差判斷,直到葉子節點結束,效率不夠高,每個節點都要用兩次計算深度的遞迴函式 思路二 從葉子節點開始,計算深度差,一旦有深度差大於1的,就直接返回0,也不用管上面的深度是不是正確了,畢竟我們只需要true和false兩種狀態,省...

滿二叉樹 完全二叉樹 平衡二叉樹 最優二叉樹

一棵二叉樹的結點要麼是葉子結點,要麼它有兩個子結點 如果乙個二叉樹的層數為k,且結點總數是 2k 12 k 1 2k 1 則它就是滿二叉樹。若設二叉樹的深度為k,除第 k 層外,其它各層 1 k 1 的結點數都達到最大個數,第k 層所有的結點都連續集中在最左邊,這就是完全二叉樹。它或者是一顆空樹,或...