代码随想录刷题】Day16 二叉树03

代码随想录刷题】Day16 二叉树03_第1张图片

文章目录

  • 1.【104】二叉树的最大深度(优先掌握递归)
    • 1.1 题目描述
    • 1.2 java代码实现
  • 2.【111】二叉树的最小深度(优先掌握递归)
    • 2.1 题目描述
    • 2.2 java代码实现
  • 3.【222】完全二叉树的节点个数
    • 3.1 题目描述
    • 3.2 java代码实现

【104】二叉树的最大深度
【111】二叉树的最小深度
【222】完全二叉树的节点个数

1.【104】二叉树的最大深度(优先掌握递归)

【104】二叉树的最大深度

1.1 题目描述

给定一个二叉树 root ,返回其最大深度。

二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
代码随想录刷题】Day16 二叉树03_第2张图片

1.2 java代码实现

使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数,和层序遍历的方式极其吻合。

在二叉树中,一层一层的来遍历二叉树,记录一下遍历的层数就是二叉树的深度,如图所示:
代码随想录刷题】Day16 二叉树03_第3张图片

所以这道题的迭代法就是一道模板题,可以使用二叉树层序遍历的模板来解决的。

class solution {
    /**
     * 递归法
     */
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftDepth = maxDepth(root.left);
        int rightDepth = maxDepth(root.right);
        return Math.max(leftDepth, rightDepth) + 1;
    }
}
	/**
     * 迭代法
     */
class Solution {
    public int maxDepth(TreeNode root) {
        Queue<TreeNode> que=new LinkedList<>();
        if (root==null){
            return 0;
        }
        
        que.offer(root);
        int depth=0;//深度
        while (!que.isEmpty()) {
            int len=que.size();
            for (int i=0;i<len;i++){
                TreeNode tempNode=que.poll();
                if (tempNode.left!=null){
                    que.offer(tempNode.left);
                }
                if (tempNode.right!=null){
                    que.offer(tempNode.right);
                }
            }
            depth++;
        }
        return depth;

    }
}

2.【111】二叉树的最小深度(优先掌握递归)

【111】二叉树的最小深度

2.1 题目描述

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。
代码随想录刷题】Day16 二叉树03_第4张图片

2.2 java代码实现

相对于 【104】二叉树的最大深度,本题还也可以使用层序遍历的方式来解决,思路是一样的。

需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。 如果其中一个孩子为空则不是最低点。

class Solution {
    /**
     * 递归法,相比求MaxDepth要复杂点
     * 因为最小深度是从根节点到最近**叶子节点**的最短路径上的节点数量
     */
    public int minDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftDepth = minDepth(root.left);
        int rightDepth = minDepth(root.right);
        if (root.left == null) {
            return rightDepth + 1;
        }
        if (root.right == null) {
            return leftDepth + 1;
        }
        // 左右结点都不为null
        return Math.min(leftDepth, rightDepth) + 1;
    }
}
class Solution {
    public int minDepth(TreeNode root) {
    //迭代法
        /**
         * 相对于 104.二叉树的最大深度 ,
         * 本题还也可以使用层序遍历的方式来解决,思路是一样的。
         *
         * 需要注意的是,只有当左右孩子都为空的时候,才说明遍历的最低点了。
         * 如果其中一个孩子为空则不是最低点
         */
        Queue<TreeNode> que = new LinkedList<>();
        if (root == null) {
            return 0;
        }

        que.offer(root);
        int depth = 0;
        while (!que.isEmpty()){
            int len = que.size();
            depth++;
            TreeNode tempNode = null;
            for (int i = 0; i < len; i++) {
                tempNode = que.poll();
                //如果当前节点的左右孩子都为空,直接返回最小深度
                if (tempNode.left == null && tempNode.right == null){
                    return depth;
                }
                if (tempNode.left != null) que.offer(tempNode.left);
                if (tempNode.right != null) que.offer(tempNode.right);
            }
        }
        return depth;

    }
}

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

【222】完全二叉树的节点个数

3.1 题目描述

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
代码随想录刷题】Day16 二叉树03_第5张图片
提示:

  • 树中节点的数目范围是[0, 5 * 104 ]
  • 0 <= Node.val <= 5 * 104
  • 题目数据保证输入的树是 完全二叉树

3.2 java代码实现

class Solution {
    // 通用递归解法
    public int countNodes(TreeNode root) {
        if(root == null) {
            return 0;
        }
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}
class Solution {
    // 迭代法
    public int countNodes(TreeNode root) {
        if (root == null) return 0;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int result = 0;
        while (!queue.isEmpty()) {
            int size = queue.size();
            while (size -- > 0) {
                TreeNode cur = queue.poll();
                result++;
                if (cur.left != null) queue.offer(cur.left);
                if (cur.right != null) queue.offer(cur.right);
            }
        }
        return result;
    }
}

你可能感兴趣的:(代码随想录刷题,java,数据结构,leetcode)