判斷二叉樹是不是平衡的

2021-06-20 13:57:39 字數 1154 閱讀 5523

問題描述:輸入一棵二叉樹的根結點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意結點的左右子樹的深度相差不超過

1,那麼它就是一棵平衡二叉樹。例如下圖中的二叉樹就是一棵平衡二叉樹:

思路:對於樹的題目,第一反應就是用遞迴。對於以某個結點為根的樹,只需計算出它的左右子樹的深度,如果深度相差小於等於1,則遞迴判斷它的左右子樹是不是平衡樹;否則肯定不是平衡二叉樹。這個問題的關鍵是要計算樹的深度,如果是自頂向下,會有很多重複的計算。計算以1為根的樹的深度,會牽涉到以2為根、以3為根的子樹。計算以2為根的樹的深度,會牽涉到以4為根、以5為根的子樹。由於要遍歷每個結點,判斷以該結點為根的樹是不是平衡二叉樹。所以計算以1為根的樹的深度,與計算以2為根的樹的深度,會重複計算以4為根、以5為根的子樹的深度。

消除重複辦法,當時是能記錄下之前計算過的子樹的深度,下次使用就不用重新計算。這就需要自底向上的計算深度。慶幸的是遞迴解決樹的問題,就是自底向上的過程。因為我們在遞迴求解中,先要得出子樹的解,子樹的解最終會轉換為葉結點的解。可以利用後序遍歷的方法,遍歷每個結點時,先判斷它的左右子樹是不是平衡二叉樹,同時記錄下左右子樹的深度,然後判斷該結點為根的樹是不是平衡二叉樹,至於該樹的深度計算很方便,取左右子樹中較大的深度+1就可以了。這裡左右子樹的深度在遞迴求解中已經計算出來,不需要重複計算了。

參考**:

[cpp]view plain

copy

print?

struct

binarytreenode  

;  //函式功能 : 判斷二叉樹是不是平衡的

//函式引數 : proot為根結點,pdepth為根結點的深度。

//返回值 :   是否平衡的

bool

isbalanced(binarytreenode *proot, 

int*pdepth)  

intleftdepth, rightdepth; 

//左右子樹的深度

if(isbalanced(proot->pleft, &leftdepth)&&  

isbalanced(proot->pright, &rightdepth))  

else

return

false

;  }  

return

false

;  

判斷二叉樹是不是平衡

題目 輸入一棵二叉樹的根結點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。例如下圖 中的二叉樹就是一棵平衡二叉樹 上面的 固然簡潔,但我們也要注意到由於乙個節點會被重複遍歷多次,這種思路的時間效率不高。例如在函式 isbalance 中輸入...

判斷是不是平衡二叉樹

問題 給出一棵二叉樹,判斷它是不是二叉樹。乙個比較容易想到的做法是,採用動態規則的方法依次求出每乙個節點的左子樹深度和右子樹深度,兩者相減,絕對值大於 1 則不是平衡樹。為了避免重複計算節點的深度,應該用後序遍歷的方法,即先計算子節點的深度,再計算當前節點的深度,這樣不會出現重複計算。如下 stru...

判斷二叉樹是不是平衡

題目 輸入一棵二叉樹的根結點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。例如下圖 中的二叉樹就是一棵平衡二叉樹 2上面的 固然簡潔,但我們也要注意到由於乙個節點會被重複遍歷多次,這種思路的時間效率不高。例如在函式 isbalance 中輸...