代码随想录第十六天

代码随想录第十六天

    • Leetcode 104. 二叉树的最大深度
    • Leetcode 559. N 叉树的最大深度
    • Leetcode 111. 二叉树的最小深度
    • Leetcode 222. 完全二叉树的节点个数

Leetcode 104. 二叉树的最大深度

题目链接: 二叉树的最大深度
自己的思路:后序遍历,左右中遍历,二叉树的最大深度即为根结点的高度,使用后序遍历,将左右孩子的高度的最大值+1根结点;递归三部曲:1、终止条件:当结点为空时,返回0,因为node到空结点的深度为0;2、形参列表:输入参数为当前结点,因为后面是判断当前结点的左右孩子的高度的最大值;3、单层递归的逻辑,在一次递归的时候,假设某个递归的结点为node,先计算左孩子的最大深度,再计算右孩子的最大深度,然后取两者的最大值再+1即是当前node的最大深度!!!

正确思路:递归,递归!!!!

代码:

class Solution {
    public int maxDepth(TreeNode root) {
        if (root==null) return 0;
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        int res = Math.max(left,right) + 1;
        return res;
    }
}

复杂度分析
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

相似题型

Leetcode 559. N 叉树的最大深度

题目链接: N 叉树的最大深度
自己的思路:递归!!!!和104题基本一致!!!!

正确思路:递归,递归!!!!

代码:

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

复杂度分析
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

Leetcode 111. 二叉树的最小深度

题目链接: 二叉树的最小深度
自己的思路:没做出来!!!

正确思路:使用后序遍历来处理,通过计算左右孩子的最小高度,取其最小值然后加1返回给父结点;这里要注意的是,有可能一开始根节点的左孩子就是空的,而题目中最小深度的定义是从根节点到叶子节点的最小距离,所以这种情况我们要单独考虑,故递归三部曲:1、终止条件:当遇到空结点的时候返回0给父节点;2、传入参数:当前父节点;3、单层递归:先计算左右子树的最小深度,然后分情况进行处理,当左结点为空或者右结点为空的时候,直接返回不为空的最小深度加1即可,因为这种情况左边或者右边是没有叶子节点的,当两个都不为空的时候,直接返回两个最小深度的最小值然后加1即可!!!

代码:

class Solution {
    public int minDepth(TreeNode root) {
        //终止条件
        if (root==null) return 0;
        //单层递归逻辑
        int left = minDepth(root.left);
        int right = minDepth(root.right);
        if (root.left!=null&&root.right==null) return 1+left;
        else if (root.left==null&&root.right!=null) return 1+right;
        return Math.min(left,right)+1;
    }
}

复杂度分析
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

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

题目链接: 完全二叉树的节点个数
自己的思路:后序遍历,将左右孩子结点的个数返回给父节点,然后再加1;这道题和求最小深度和最大深度类似,都是从底向上进行返回,故递归三部曲:1、终止条件:当结点为空的时候,返回0;2、传入参数:当前父节点;3、单层递归:先计算左节点的数量,再计算右节点的数量,然后两个相加再加1即可,即为当前子树的结点个数!!!!

代码:

class Solution {
    public int countNodes(TreeNode root) {
        //递归终止条件
        if (root==null) return 0;
        //单层逻辑
        int left = countNodes(root.left);
        int right = countNodes(root.right);
        //返回左节点的个数+右节点的个数+1
        return left+right+1;
    }
}

复杂度分析
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

正确思路:我上面这种思想没有用到完全二叉树的特点,所以下面一种方法可以考虑将完全二叉树的特点加入进来!!完全二叉树可以分为以下几种情况:1、树为空;2、整个树是满二叉树;3、整个树不是满二叉树,但是最后一层如果不满的话,树的结点一定都在最左边;根据这种思想,我们可以定义两个指针left和right来表示左右子树的高度,如果left==right的话,左子树是满二叉树;否则,右子树是满二叉树!!

代码:

class Solution {
    public int countNodes(TreeNode root) {
        //递归终止条件
        if (root==null) return 0;
        //单层逻辑
        int left = getlevel(root.left);
        int right = getlevel(root.right);
        //左子树是满树
        if (left==right){
            return countNodes(root.right)+(1<<left);
        }else{//右子树是满树
            return countNodes(root.left)+(1<<right);
        }
    }

    public int getlevel(TreeNode node){
        int level = 0;
        while(node!=null){
            //一直向左走,计算树的深度
            node = node.left;
            level++;
        }
        return level;
    }
}

复杂度分析
时间复杂度: O ( n ) \mathcal{O}(n) O(n)
空间复杂度: O ( 1 ) \mathcal{O}(1) O(1)

你可能感兴趣的:(数据结构)