代码随想录算法训练营第十六天| 104.二叉树的最大深度 ,559.N叉树的最大深度 ,222.完全二叉树的节点个数

104.二叉树的最大深度 

104. 二叉树的最大深度

本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。

  • 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)

而根节点的高度就是二叉树的最大深度

DFS后序遍历,判断每个节点的左右节点是否为空

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) {
        //DFS
        if(root==null){return 0;}
        int leftDepth=maxDepth(root.left);
        int rightDepth=maxDepth(root.right);
        return Math.max(leftDepth,rightDepth)+1;//加上当前节点就是根节点的深度

    }
}

559.N叉树的最大深度 

559. N 叉树的最大深度 

思路:需要遍历每个节点下面的子节点,对每个子节点递归

递归三部曲:1.确定递归函数的参数和返回值;2.确定终止条件;3.确定递归逻辑


class Solution {
    public int maxDepth(Node root) {
        if(root==null){return 0;}
        int max=0;
        for(Node child:root.children){
             max=Math.max(max,maxDepth(child));
        }
        return max+1;
        
    }
}

111.二叉树的最小深度 

111. 二叉树的最小深度 

注意点最小深度和最大深度差蛮多的,最小深度求根节点到最近的叶子节点的节点数,我们分别递归根节点的左右子树的深度,判断左子树和右子树是否为空,分三种情况

1.左子树为空,右子树不为空,返回右子树节点数+1

2.左子树不为空,右子树为空,返回左子树节点数+1

3.左右子树都不为空,返回二者中的较小值+1

//最小深度是根节点到最近的叶子节点的节点数
class Solution {
    public int minDepth(TreeNode root) {//1.递归函数和返回值
        if(root==null){return 0;}//2.终止条件
      
        int leftDepth=minDepth(root.left);
        int rightDepth=minDepth(root.right);

        if(root.left==null&&root.right!=null){//左子树为空,右子树不为空
            return rightDepth+1;
        }
        if(root.left!=null&&root.right==null){//左子树不为空,右子树为空
            return leftDepth+1;
        }
        //左右子树都不为空
        return Math.min(leftDepth,rightDepth)+1;

    }
}

222.完全二叉树的节点个数

递归解法,思路是返回左子树和右子树的节点和再加1

222. 完全二叉树的节点个数

class Solution {
    public int countNodes(TreeNode root) {
        if(root==null){return 0;}
        //左子树节点数+右子树节点树+1
        return countNodes(root.left)+countNodes(root.right)+1;

    }
}

针对完全二叉树解题,关键需要看左右子树的深度是否是一样的

class Solution {
    public int countNodes(TreeNode root) {
        if(root==null){return 0;}
        int leftDepth=0;
        int rightDepth=0;
        TreeNode left=root.left;
        TreeNode right=root.right;
        while(left!=null){
            left=left.left;
            leftDepth++;

        }
        while(right!=null){
            right=right.right;
            rightDepth++;
        }
        if(leftDepth==rightDepth){
            return (2<

你可能感兴趣的:(算法)