Day16:LeedCode 104.二叉树的最大深度 111.二叉树最小深度 222.完全二叉树的结点个数

 

104. 二叉树的最大深度

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

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

思路:根结点最大深度=max(左子树最大深度,右子树最大深度)+1

终止条件,结点为null,该结点最大深度为0

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

}

111. 二叉树的最小深度

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

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

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

本题跟上题类似,但有差别

错误代码:

 与上一题求最大深度比,区别在这

当左右结点都不为空时: length=1+Math.min(minDepth(root.left),minDepth(root.right))

当左节点为空时:length=minDepth(root.right)+1

当右结点为空时:length=minDepth(root.left)+1

当根节点为空时:length=0;

 

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

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

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

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

思路:

求普通二叉树结点个数:
结点个数=左子树结点个数+右子树结点个数+1

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

我们可以把完全二叉树当成普通二叉树来求结点个数,但上面方法没利用完全二叉树的特性

 

完全二叉树的两种情况:

1.完全二叉树为满二叉树,结点个数总数= 2^树深度 - 1

2.完全二叉树不为满二叉树,但是其左子树或者右子树为满二叉树 ,满二叉树可以直接用公式计算结点个数,对于非满二叉树结点总数=左子树结点总数+右结点总数+1

 

这里关键在于如何去判断一个左子树或者右子树是不是满二叉树呢?

在完全二叉树中,如果递归向左遍历的深度等于递归向右遍历的深度,那说明就是满二叉树。如图:

递归三部曲:

1.确定返回值和参数,返回结点个数int 传入结点root

2.确认结束条件:当该子树为满二叉树为直接计算该子树结点总数

                          当该子树为Null时,结点个数为0

3.递归逻辑:当前子树结点个数=1+ countNodes(root.left)+countNodes(root.right)

class Solution {
    public int countNodes(TreeNode root) {
    if(root==null)return 0;
    int left_length=0;
    TreeNode leftN=root.left;
    while(leftN!=null){
        leftN=leftN.left;
        left_length++;
    }
    int right_length=0;
    TreeNode rightN=root.right;
    while(rightN!=null){
        rightN=rightN.right;
        right_length++;
            }
    if(right_length==left_length){
          return (2 <<  right_length) - 1;
    }
    return 1+ countNodes(root.left)+countNodes(root.right);
}
}

 

 

 

 

 

 

 

 

 

 

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-03-22 05:20:08       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-22 05:20:08       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-22 05:20:08       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-22 05:20:08       18 阅读

热门阅读

  1. MyBatis面试简答题

    2024-03-22 05:20:08       18 阅读
  2. 使用Linq的Distinct方法

    2024-03-22 05:20:08       18 阅读
  3. Linux:协议定制以及序列化和反序列化

    2024-03-22 05:20:08       17 阅读
  4. C语言学习笔记day11

    2024-03-22 05:20:08       19 阅读
  5. 网络编程模拟面试题总结, sqlite3的c语言调用,

    2024-03-22 05:20:08       19 阅读
  6. hive语法树分析,判断 sql语句中有没有select *

    2024-03-22 05:20:08       21 阅读
  7. Hive自定义GenericUDTF函数官网示例

    2024-03-22 05:20:08       15 阅读
  8. PhpSpreadsheet 读取 excel 里面的图片

    2024-03-22 05:20:08       15 阅读
  9. Docker学习笔记 - 使用配置脚本来启动image

    2024-03-22 05:20:08       18 阅读
  10. [蓝桥杯 2015 省 B] 生命之树

    2024-03-22 05:20:08       20 阅读