代码随想录刷题Day16 | 104.二叉树的最大深度 | 111.二叉树的最小深度 | 222.完全二叉树的节点个数
104.二叉树的最大深度
题目:
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
思路:
先愤青二叉树的高度和深度:
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数后者节点数(取决于高度从0开始还是从1开始)
我们采用后序遍历的方式来做,如果当前节点为空节点,返回深度0,不然深度为左右子树的深度的最大值+1
代码:
class Solution {
public int maxDepth(TreeNode root) {
if(root == null) return 0;
return 1 + Math.max(maxDepth(root.left), maxDepth(root.right));
}
}
111.二叉树的最小深度
题目:
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
*说明:*叶子节点是指没有子节点的节点。
思路:
这道题和上道题类似,也是采用后序遍历的方法。
如果我们只把上题的max修改为min,发现会报错,针对例子root = [2,null,3,null,4,null,5,null,6]而言(如下图),直接修改max为min结果应该为1才对,此时的1时头节点到其左孩子节点的深度,但是其左孩子是一个空节点,不是一个叶子节点。我们只需要对只有一个孩子节点的节点处理一下,返回其左右子树深度的最大值+1即可(抛弃空姐点的深度)
代码:
class Solution {
public int minDepth(TreeNode root) {
if(root == null) return 0;
//if(root.left == null && root.right == null) return 1;
if(root.left == null || root.right == null) return 1 + Math.max(minDepth(root.left), minDepth(root.right));
return 1 + Math.min(minDepth(root.left), minDepth(root.right));
}
}
222.完全二叉树的节点个数
题目:
给你一棵 完全二叉树 的根节点 root
,求出该树的节点个数。
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h
层,则该层包含 1~ 2h
个节点。
思路:
- 按照普通二叉树的思路,递归每一个节点,统计个数
- 利用完全二叉树的性质。如果递归向左遍历的深度等于递归向右遍历的深度,是满二叉树,直接返回2^deep - 1,如果相等,则不是满二叉树,递归左右子树。
代码:
- 普通二叉树
class Solution {
public int countNodes(TreeNode root) {
if(root == null) return 0;
return 1 + countNodes(root.left) + countNodes(root.right);
}
}
- 完全二叉树
class Solution {
public int countNodes(TreeNode root) {
if(root == null) return 0;
TreeNode left = root.left, right = root.right;
int leftDeep = 0, rightDeep = 0;
while(left != null){
left = left.left;
leftDeep++;
}
while(right != null){
right = right.right;
rightDeep++;
}
if(leftDeep == rightDeep){
return (2 << leftDeep) - 1;
}
return 1 + countNodes(root.left) + countNodes(root.right);
}
}