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

104. 二叉树的最大深度 

题目描述:

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

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回它的最大深度 3 。
链接:https://leetcode.cn/problems/maximum-depth-of-binary-tree
首先先了解一下二叉树的深度和高度的区别:

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

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

用递归法来计算二叉树节点的深度(迭代法后续学习):

解题思路:

  1. 确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回这棵树的深度,所以返回值为int类型。
  2. 确定终止条件:如果为空节点的话,就返回0,表示高度为0。
  3. 确定单层递归的逻辑:先求它的左子树的深度,再求的右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。
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;
        
    }
}

 |

 给定一个 N 叉树,找到其最大深度。

最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。
链接:https://leetcode.cn/problems/maximum-depth-of-n-ary-tree
思路同理于二叉树:当节点的子节点不为空时,遍历当前节点的所有子节点,保留最大深度,最后的返回值记得加一

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

 111. 二叉树的最小深度

 题目描述:

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

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

说明:叶子节点是指没有子节点的节点。

注:二叉树用递归求最大深度的时候,自然是直接递归,返回最大值加一;自然而然会想到最小值是递归的最小值加一,但是,求最小值时是要求根节点到叶子节点的路径的长度,此时需要考虑根节点是否有左右子节点。

递归做法:

①确定递归函数的参数和返回值: 参数是即将要求的二叉树的根节点,返回值是int类型的

②确定终止条件:终止条件是遇到空节点返回0,表示 当前节点的高度为0;

③确定单层递归逻辑:如果左子树为空,则返回右子树加一;如果右子树为空,则返回左子树加一,若都不为空,则返回两者中最小的值加一。

二叉树的最小深度和二叉树的最大深度的主要区别是左右子树是否为空

class Solution {
    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;
        }else if(root.right == null){
            return leftdepth + 1;
        }else{
            return Math.min(leftdepth,rightdepth) + 1;
        }

    }
}

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

 题目描述:

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

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
链接:https://leetcode.cn/problems/count-complete-tree-nodes
普通二叉树的解法:

①确定递归函数的参数和返回值类型:参数是待求二叉树的根节点,返回的是节点数量,是int类型

②确定终止条件:如果为空节点的话,就返回0,表示节点数为0。

③单层的递归逻辑:先求它的左子树的节点数量,再求的右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。

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

    }
}

 完全二叉树的解法:(后续添加)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值