劍指Offer 面試題39 二叉樹的深度

2021-07-26 09:55:40 字數 1464 閱讀 9928

題目描述:輸入一棵二叉樹的根結點,求該樹的深度。從根結點到葉子點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。

題目分析:如果一棵樹只有乙個結點,它的深度為1。 如果根結點只有左子樹而沒有右子樹, 那麼樹的深度應該是其左子樹的深度加1,同樣如果根結點只有右子樹而沒有左子樹,那麼樹的深度應該是其右子樹的深度加1. 如果既有右子樹又有左子樹, 那該樹的深度就是其左、右子樹深度的較大值再加1

public static int treedepth(binarytreenode root) 

intleft = treedepth(root.left);

intright = treedepth(root.right);

return (left > right) ? left + 1 : right + 1;

}

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

題目分析:

解法一:需要重複遍歷結點多次的解法,簡單但不足以打動面試官。

在遍歷樹的每個結點的時候,呼叫函式treedepth得到它的左右子樹的深度。如果每個結點的左右子樹的深度相差都不超過1 ,按照定義它就是一棵平衡的二叉樹。

public static boolean isbalancetree(binarytreenode root) 

intleft = treedepth(root.left);

intright = treedepth(root.right);

int diff = left - right;

if (diff > 1 || diff < -1)

return isbalancetree(root.left) && isbalancetree(root.right);

}

解法二:每個結點只遍歷一次的解法

用後序遍歷的方式遍歷二叉樹的每乙個結點,在遍歷到乙個結點之前我們就已經遍歷了它的左右子樹。只要在遍歷每個結點的時候記錄它的深度(某一結點的深度等於它到葉節點的路徑的長度),我們就可以一邊遍歷一邊判斷每個結點是不是平衡的。

public

static

boolean

isbalancetree2(binarytreenode root, int depth)

int left=new

int[1],right=new

int[1];

if(isbalancetree2(root.left,depth)&&isbalancetree2(root.right,depth))

}return

false;

}public

static

boolean

isbalanced(binarytreenode root)

劍指Offer 面試題39 二叉樹的深度

二叉樹的深度 輸入一顆二叉樹的根節點,求該樹的深度。從根節點到葉節點依次經過的節點 含根 也節點 形成樹的一條路徑,最長路徑的長度為樹的深度 12 3 4 5 6 7圖中二叉樹的深度為4,從根節點1開始經過結點2和5,最終到達葉結點7 輸入 第一行輸入有n,n表示結點數,結點號從1到n。根結點為1。...

(劍指Offer)面試題39 二叉樹的深度

輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點 含根 葉結點 形成樹的一條路徑,最長路徑的長度為樹的深度。結點的定義如下 struct treenode 對於樹的問題基本都可以通過遞迴來解決。一棵二叉樹的深度,等於它的左子樹深度和右子樹深度的較大者 1 遞迴的結束條件就是 該結點為空,...

《劍指Offer》面試題 平衡二叉樹

題目 輸入乙個二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。思路 用後序遍歷實現 先遍歷節點的左右子樹,左右子樹都平衡才來判斷該節點是否平衡,如果左右子樹中有不平衡的,則直接返回false,避免了從上往下逐個節點地計算深度帶來...