二叉樹有深度和高度兩個屬性,一個節點的深度指的是從根節點到該節點路徑的長度,根節點的深度為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