題目一:二叉樹的深度
輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度爲樹的深度。
思路:嘿嘿,遞歸簡簡單單幾行搞定,有點類似展開樹求最大值。
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public int TreeDepth(TreeNode root) {
if (root == null) {
return 0;
}
return Math.max(TreeDepth(root.left), TreeDepth(root.right)) + 1;
}
}
- 時間複雜度:O(n)。
- 空間複雜度:O(logn)。
練習地址:https://www.nowcoder.com/practice/435fb86331474282a3499955f0a41e8b
題目二:平衡二叉樹
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。如果某二叉樹中任意節點的左、右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。
是的,還是遞歸,跟上面題目一不同的是我們需要優化一下,即遍歷到左右深度相差大於1時就停止遞歸了。較少複雜度
public class Solution {
int totalCount=0; // 使用變量記錄當前比較的兩個分支的深度值
public boolean IsBalanced_Solution(TreeNode root) {
if(root==null){
totalCount = 0;
return true;
}
// 當前短枝已經不滿足條件則不再遞歸
if(!IsBalanced_Solution(root.left)){
return false;
}
int left = totalCount;
// 當前短枝已經不滿足條件則不再遞歸
if(!IsBalanced_Solution(root.right)){
return false;
}
int right = totalCount;
int diff = left - right;
if(diff<=1&&diff>=-1){
totalCount = 1+(left>right?left:right); // 賦值
return true;
}else{
return false;
}
}
}
- 時間複雜度:O(n)。
- 空間複雜度:O(logn)。