JAVA二刷-Day16 | 104.二叉树的最大深度, 111.二叉树的最小深度, 222.完全二叉树的节点个数 (递归)

JAVA二刷-Day16 | 104.二叉树的最大深度, 111.二叉树的最小深度, 222.完全二叉树的节点个数 (递归)

二叉树高度和深度的区别:https://blog.csdn.net/demonandyu/article/details/85331904

二叉树的最大深度

LeetCode题目:https://leetcode.cn/problems/maximum-depth-of-binary-tree/

解题思路

  要注意递归的整体架构可以确定为前序遍历,中序遍历,后序遍历三种类型。需要确定递归所需要哪种遍历类型,以此来进行相应的递归操作。

  代码:

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);

        return Math.max(left, right) + 1;

    }
}

二叉树的最小深度

LeetCode题目链接:https://leetcode.cn/problems/minimum-depth-of-binary-tree/

解题思路

  本题应当注意的是,比较的最小深度指的是root节点到最近的叶子节点的深度,不能直接判定如果左右子树有一个为null便直接返回数值。如果存在null应当忽略该子树的信息。

  具体代码如下:

class Solution {
    public int minDepth(TreeNode root) {
        if (root == null) return 0;
        if (root.left == null && root.right == null) return 1;
        int left = Integer.MAX_VALUE;
        int right = Integer.MAX_VALUE;
        if (root.left != null) left = minDepth(root.left);
        if (root.right != null) right = minDepth(root.right);
        return Math.min(left, right) + 1;
    }
}

完全二叉树的节点个数

LeetCode题目链接:https://leetcode.cn/problems/count-complete-tree-nodes/

完全二叉树定义:https://blog.csdn.net/JMW1407/article/details/108204019

解题思路

  完全二叉树由于特有的性质,可以看做是很多个小的满二叉树的集合,因此可以通过满二叉树的特性来进行计算,即满二叉树的节点个数为 2 n − 1 2^n-1 2n1,n为满二叉树的高度。因此,可以当判定节点空或者为满二叉树时,计算节点数并返回,如果没有满足,则向下递归。

  因此通过满二叉树的特点进行了截断,避免了冗余的递归操作。

  具体代码如下:

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

        while (right != null) {
            right = right.right;
            rightDepth++;
        }

        if (leftDepth == rightDepth) {
            return (int)Math.pow(2, leftDepth + 1) - 1;
        }

        return countNodes(root.left) + countNodes(root.right)  + 1;
    }
}

你可能感兴趣的:(数据结构,java,开发语言)