題目描述
輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。
解題思路
兩種解法,一種是第一時間的思路,即獲得根節點到每個葉節點的深度,取其中最長的返回:
class Solution:
def __init__(self):
self.maxDeep = 0
self.curDeep = 0
def TreeDepth(self, pRoot):
if not pRoot:
return 0
self.curDeep += 1
self.TreeDepth(pRoot.left)
self.maxDeep = self.curDeep if self.curDeep > self.maxDeep else self.maxDeep
self.TreeDepth(pRoot.right)
self.maxDeep = self.curDeep if self.curDeep > self.maxDeep else self.maxDeep
self.curDeep -= 1
這種方案可以解決問題,但是代碼不好看,還定義了兩個公共變量。第二種解法是自底而上,每當從子節點回退到其父節點時,返回左右子節點中最深的分支值,沒有公共變量,代碼短小精悍:
def TreeDeep(self, pRoot):
if not pRoot:
return 0
left = self.TreeDeep(pRoot.left)+1
right = self.TreeDeep(pRoot.right)+1
return left if left>right else right
如果想進一步縮短代碼高度,那就把left和right的表達式帶入第6行代碼中。雖然代碼高度進一步縮短,但是增加了代碼寬度,且降低了代碼的可讀性,《Clean Code》中所不建議的方式,所以就到此為止了~
————————————————
版權聲明:本文為CSDN博主「goddaniel」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u010005281/article/details/79659747
===========
二叉樹有深度和高度兩個屬性,一個節點的深度指的是從根節點到該節點路徑的長度,根節點的深度為1;一個節點的高度指的是從該節點到葉子節點所有路徑上包含節點個數的最大值。葉子節點的高度為1,往上節點的高度依次遞增。所以要求二叉樹的深度,我們要求出從根節點到葉子結點最長路徑的長度,從根節點到所有的葉子結點,實際就是在遍歷這棵樹,使用深度優先遍歷可以解決這個問題。
首先還是定義一顆二叉樹的類。
1 class TreeNode: 2 def __init__(self, x): 3 self.val = x 4 self.left = None 5 self.right = None
然后,為了得到從根節點到葉子結點路徑的長度,我們從根節點出發,進行深度優先遍歷,當遍歷到一個葉子結點時,就計算出了一條路徑的長度,這時返回到上一層,即葉子結點的父親節點,繼續對另一顆子樹進行深度優先遍歷,計算其他路徑的長度。因此,這里有兩個問題,第一,我們需要一個變量保存當前遍歷路徑的長度,它保存的一定是當前遍歷的路徑長度,應該作為函數的參數(深度優先遍歷的函數);第二,當遍歷到葉子節點時,我們要判斷這條路徑的長度是否是最長的,因此還需要一個變量來保存當前最長的路徑長度,它不會隨着函數的迭代改變,應當是一個全局變量,代碼如下。
class Solution: #二叉樹的深度 def TreeDepth(self, pRoot): # write code here global maxdepth#全局變量保存當前最長的路徑長度 maxdepth=0 def DfsTree(root,depth=0):#depth是當前的路徑長度 global maxdepth if root:#節點非空,路徑長度加1 depth+=1 if root.left:#左子樹非空,繼續遍歷左子樹 DfsTree(root.left,depth) if root.right:#右子樹非空,繼續遍歷右子樹 DfsTree(root.right,depth) if not root.left or root.right:#左右子樹都是空的,即該節點是一個葉子結點,則判斷depth是不是最長的路徑 if depth>maxdepth: maxdepth=depth if root: DfsTree(root) return maxdepth