day16:二叉树-104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数
LeetCode 104.二叉树的最大深度
注意区分出这两个概念:
1、二叉树的深度:
- 深度通常指的是从根节点到某个特定节点的路径上的节点数量。也可以称之为节点的层级。
- 树的深度可以用来表示某个节点在树中的相对位置。
- 如果以根节点为起点,深度为1,每向下一层深度加1。
2、二叉树的高度:
- 高度通常指的是从某个节点到其最远叶子节点的最长路径上的节点数量。
- 树的高度通常用来表示整棵树的大小,即树中节点的最大层数。
- 根节点的高度通常被定义为树的高度。
以这颗树为例:
根节点的深度是1,高度是3
节点9、20的深度是2,高度是2
节点15、7的深度是3,高度是1
题目链接:
文章讲解:
https://programmercarl.com/0104.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%A4%A7%E6%B7%B1%E5%BA%A6.html#%E6%80%9D%E8%B7%AF
视频讲解:
https://www.bilibili.com/video/BV1Gd4y1V75u/
思路和解法:
- 如果二叉树为空(即根节点为null),则最大深度为0。
- 如果二叉树不为空,最大深度可以通过递归计算其左子树和右子树的最大深度,然后取两者中的较大值,并加上1,加一是因为是从根节点的左右子树开始递归的,要把根节点加上表示当前节点的深度。
public class Solution {
public int MaxDepth(TreeNode root) {
if(root == null)
return 0;
//计算左子树的最大深度
int leftDepth = MaxDepth(root.left);
//计算右子树的最大深度
int rightDepth = MaxDepth(root.right);
//后面加一是因为是从根节点的左右子树开始递归的,要把根节点加上
return leftDepth > rightDepth ? leftDepth + 1: rightDepth + 1;
}
}
LeetCode 111.二叉树的最小深度
题目链接:
文章讲解:
https://programmercarl.com/0111.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E6%B7%B1%E5%BA%A6.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
视频讲解:
https://www.bilibili.com/video/BV1QD4y1B7e2
思路和解法:
注意题目中对最小深度的定义:最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
需要考虑树为空,和树只有一个根节点的情况。
int.MaxValue
是用来表示没有左子树或右子树的情况的。当我们计算左子树或右子树的最小深度时,如果该子树为空(即没有左子树或右子树),我们需要返回一个特定的值,以便在比较左右子树的深度时能够正确处理这种情况。
int.MaxValue
是 int
数据类型的最大值,它被用作一个占位符,表示没有左子树或右子树的情况下,深度应该被认为是无穷大。这样,当我们比较左子树和右子树的深度时,如果其中一个子树为空,它的深度就会被认为是无穷大,从而确保我们选择另一个子树的深度作为最小深度。
这个做法是为了确保在比较深度时,空子树不会被错误地视为具有深度为0的情况,从而保证了正确的最小深度计算。
public class Solution {
public int MinDepth(TreeNode root) {
//树为空,则为0
if(root == null)
return 0;
//只有根节点
if(root.left == null && root.right == null)
return 1;
int leftDepth = root.left != null ? MinDepth(root.left) : int.MaxValue;
int rightDepth = root.right != null ? MinDepth(root.right) : int.MaxValue;
return leftDepth < rightDepth ? leftDepth + 1 : rightDepth + 1;
}
}
LeetCode 222.完全二叉树的节点个数
完全二叉树:除了底层之外,其他层数的节点都是满的,且底层节点一定是从左到右连续的
题目链接:
文章讲解:
https://programmercarl.com/0222.%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8%8A%82%E7%82%B9%E4%B8%AA%E6%95%B0.html
视频讲解:
https://www.bilibili.com/video/BV1eW4y1B7pD/
思路和解法:
递归
- 首先判断根节点是否为空,如果为空则返回0。
- 对于完全二叉树,可以通过递归的方式计算左子树和右子树的节点个数。
- 首先计算左子树的节点个数,可以通过一直往左走并计数,直到遇到空节点为止。因为是完全二叉树,所以左子树一定会一直走到底,不会有空节点。
- 然后计算右子树的节点个数,同样可以通过一直往右走并计数,直到遇到空节点为止。
- 最后返回左子树节点个数加上右子树节点个数再加上1(表示根节点本身),即
return 1 + 左子树节点个数 + 右子树节点个数
。 - 递归终止条件是当根节点为空时,返回0。
public class Solution {
public int CountNodes(TreeNode root) {
if(root == null)
return 0;
int leftCount = CountNodes(root.left);
int rightCount = CountNodes(root.right);
return leftCount + rightCount + 1;
}
}
int leftCount = CountNodes(root.left);
int rightCount = CountNodes(root.right);
return leftCount + rightCount + 1;
}
}