算法學習之二叉樹的深度

題目一:二叉樹的深度

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

思路:嘿嘿,遞歸簡簡單單幾行搞定,有點類似展開樹求最大值。

/**
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)。
發佈了94 篇原創文章 · 獲贊 8 · 訪問量 5140
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章