程式碼隨想錄 第十六天 | ● 104.二叉樹的最大深度 559.n叉樹的最大深度 ● 111.二叉樹的最小深度 ● 222.完全二叉樹的節點個數

22软工冷薄發表於2024-03-09

leetcode:104. 二叉樹的最大深度 - 力扣(LeetCode)

思路:遞迴判斷每次左右節點的是否存在,存在自然加一,return的1就是這樣,判斷子節點的左右兩端是否有節點,統計有的節點數量,也就是左右的高度

class Solution {
    public int maxDepth(TreeNode root) {
        //後序遍歷
        if( root == null) return 0;
        int leftheight = maxDepth(root.left);
        int rightheight = maxDepth(root.right);
        return 1+Math.max(leftheight,rightheight);
    }

}

leetcode:111. 二叉樹的最小深度 - 力扣(LeetCode)

思路:後序遍歷,唯一不同點在最小子節點不能把null算上,分類討論左右節點分別為null的情況

class Solution {
    public int minDepth(TreeNode root) {
        if(root == null) return 0;
        int leftheight = minDepth(root.left);
        int rightheight = minDepth(root.right);
        //和最大深度不同的是,節點為空時,不能算作子節點,所以要分類討論左右節點為空的情況
        if(root.left == null && root.right != null) return 1+rightheight;
        if(root.left != null && root.right == null) return 1+leftheight;
        return 1 + Math.min(leftheight,rightheight);
    }
}

leetcode:559. N 叉樹的最大深度 - 力扣(LeetCode)

思路:和二叉樹左右節點思路一致,唯一區別在多個子節點,使用陣列判斷每個節點的子節點的深度,兩兩比較最大值

class Solution {
    public int maxDepth(Node root) {
        if(root == null) return  0;
        int n = 0;
        //判斷上一個和現在children的深度
        for(Node child : root.children){
            n = Math.max(n,maxDepth(child));
        }
        return n + 1;
    }

}

leetcode:222. 完全二叉樹的節點個數 - 力扣(LeetCode)

思路:判斷左右子節點的數目是否相同,相同利用公式快速記錄滿叉樹節點數目,剩下的正常記錄,遞迴真好用,

class Solution {
    public int countNodes(TreeNode root) {
        if(root == null)return 0;
        TreeNode left = root.left;
        TreeNode right = root.right;
        int leftlen = 0;
        int rightlen = 0;
     //記錄兩邊左右節點數目
while(left != null){ left = left.left; leftlen++; } while(right != null){ right = right.right; rightlen++; } //成立說明是滿叉樹,直接帶入公式 if(leftlen == rightlen) return (2 <<leftlen ) - 1; int leftsum = countNodes(root.left); int rightsum = countNodes(root.right); return 1 + leftsum + rightsum; } }

相關文章