我正在通過職業杯指南作爲通過基本CS主體的速成課程,並堅持計算二叉樹的最小/最大深度的示例。由於這是幾乎所有例子,我認爲我會在這裏發表一個問題。瞭解如何計算二叉樹的深度
該指令旨在實現一種方法,該方法將檢查樹是否平衡。爲了做到這一點,你需要比較最小深度和最大深度,並確保它們之間的差值不大於1。這個原則就像它所得到的一樣簡單。第15行的方法是爲了做到這一點。
但是,我不明白每個幫助程序方法(和minDepth
)的返回語句是怎麼回事。如何從root.left
或root.right
派生出一個數字? 是否Math.max
功能簡單地假設一個1
或0
是有值/空節點,或者,由於被指定值(只是Node
對象),確實Math.max(maxDepth(root.left), maxDepth(root.right)
本身等於0
,從而增加由1
直到返回值兩個節點都是空的?
如果所以這是用於計算一個樹的最小/最大深度的一般過程:
minDepth =沒有根有孩子嗎? yes = minDepth = 1,no = minDepth = 0(如果有根目錄)
maxDepth =循環兩個分支,直到找到離根最遠的葉。保持一個櫃檯去確定葉子。
1 public static int maxDepth(TreeNode root) {
2 if (root == null) {
3 return 0;
4 }
5 return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
6 }
7
8 public static int minDepth(TreeNode root) {
9 if (root == null) {
10 return 0;
11 }
12 return 1 + Math.min(minDepth(root.left), minDepth(root.right));
13 }
14
15 public static boolean isBalanced(TreeNode root){
16 return (maxDepth(root) - minDepth(root) <= 1);
17 }
這就是我沒有遵循的:maxDepth(root.left)如何返回樹的深度? – NealR
@NealR'maxDepth(root.left)'返回子樹的最大深度,其根是原始樹的根的左子。如果您對遞歸不熟悉,則需要時間來習慣它(並且相信它實際上可行)。 – Eran
對不起,在這裏頭很重,但是這些數字(最大深度)是如何計算的? – NealR