題目描述
輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。
解題思路
想了很久。。首先本渣渣就不太理解遞歸在python中的實現,其次又不知道怎么去找到最長路徑,真是很費腦子,開始正題吧
首先明確二叉樹每個節點都可以看作“根節點”,依次延伸下去(二叉樹的遞歸定義),對於根節點,我要求這個節點的最大深度,那么只要求兩棵左右子樹的最大深度,並且max一下,然后+1就行了;然后對於左右兩棵子樹,也只要求它們的兩棵左右子樹的最大深度,然后max一下並且+1就行了。。。。。到了葉子節點,它沒有左右兩棵子樹了,那么它的最大深度就直接賦值為1,然后一層一層往上去實現(剛才是往下展開),就可以求出根節點到最底層葉子節點的最大深度,簡直是很牛逼的思路!
給出代碼具體分析:
class Solution: def TreeDepth(self, pRoot): # write code here if pRoot == None: return 0 lDepth = self.TreeDepth(pRoot.left) rDepth = self.TreeDepth(pRoot.right) return max(lDepth,rDepth)+1
假設有如下二叉樹,
代碼執行情況如下:
首先十分明確的一點是,TreeDepth(60)的結果就是返回值,就是要求出來的,不要被遞歸函數的壓棧、出棧給混淆了,return的一定是TreeDepth(根節點)的返回值
TreeDepth(60)= max(TreeDepth(12),TreeDepth(90))+1,OK,求那兩個未知的值
TreeDepth(12)是1,因為它的左右節點都不存在,兩個返回值都是0,所以max()+1之后就是1,
而TreeDepth(90)這個東西,也要一層層遞歸下去求解,容易看出來,這個值是3
最后,max(TreeDepth(12),TreeDepth(90))+1求出來就是4