语言:Java/C++
104.二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例: 给定二叉树 [3,9,20,null,null,15,7],
返回它的最大深度 3 。
递归法
本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。
- 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
- 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)
而根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。
用后序遍历(左右中)来计算树的高度。
- 确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回这棵树的深度,所以返回值为int类型。
int getdepth(TreeNode* node)
- 确定终止条件:如果为空节点的话,就返回0,表示高度为0。
if (node == NULL) return 0;
- 确定单层递归的逻辑:先求它的左子树的深度,再求右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。
int leftdepth = getdepth(node->left); // 左 int rightdepth = getdepth(node->right); // 右 int depth = 1 + max(leftdepth, rightdepth); // 中 return depth;
最终代码:
import java.lang.Math;
class Solution {
int getDepth(TreeNode node){
if(node == null) return 0;
int leftDepth=getDepth(node.left);
int rightDepth=getDepth(node.right);
int depth=1+Math.max(leftDepth,rightDepth);
return depth;
}
public int maxDepth(TreeNode root) {
return getDepth(root);
}
}
111.二叉树的最小深度
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7]
这道题看起来跟上一题求最大深度类似,但有许多要区分和注意的点。首先最小深度是从根节点到最近叶子节点的最短路径上的节点数量,所以如下图最小深度不可能是1,而是到第一个叶子结点。
本题依然可以选前序遍历或后序遍历来实现,后序遍历即求根节点到叶子结点的最小高度
- 确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回这棵树的深度,所以返回值为int类型。
int getDepth(TreeNode node)
- 确定终止条件:即遇到空节点
if(node==null) return 0;
- 确定单层递归逻辑:在求最大深度的时候,求max(leftDepth, rightDepth)+1即可,但是求最小深度的时候不可以使用1 + min(leftDepth, rightDepth),因为这样没有左孩子的分支会被算为最小深度。因此需要先进行判断,如果一个节点左子树为空右子树不为空,则最小深度为右子树+1,反之若右子树为空左子树不为空则为右子树+1,若都不为空,则取1 + min(leftDepth, rightDepth)。
int leftDepth=getDepth(node.left); int rightDepth=getDepth(node.right); if(node.left==null && node.right!=null) return 1+rightDepth; if(node.right==null && node.left!=null) return 1+leftDepth; return 1+Math.min(rightDepth,leftDepth)
import java.lang.Math;
class Solution {
int getDepth(TreeNode node){
if(node==null) return 0;
int leftDepth=getDepth(node.left);
int rightDepth=getDepth(node.right);
if(node.left==null && node.right!=null) return 1+rightDepth;
if(node.right==null && node.left!=null) return 1+leftDepth;
return 1+Math.min(leftDepth,rightDepth);
}
public int minDepth(TreeNode root) {
return getDepth(root);
}
}
222.完全二叉树的节点个数
给你一棵 完全二叉树 的根节点
root
,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第
h
层,则该层包含1~ 2h
个节点。示例 1:
- 输入:root = [1,2,3,4,5,6]
- 输出:6
示例 2:
- 输入:root = []
- 输出:0
提示:
- 树中节点的数目范围是[0, 5 * 10^4]
- 0 <= Node.val <= 5 * 10^4
- 题目数据保证输入的树是 完全二叉树
完全二叉树意味着除倒数第二层的最后一个节点外,其余节点均有左右子树,因此可以利用求最大深度的思路,先求左子树的节点数量,再求右子树的节点数量,最后将其相加。
今日总结
一般来讲,求高度用前序遍历,求深度用后序遍历,但是如果涉及到一棵树的最大最小深度时,可以将其转换为求根节点的高度,使用后序遍历来进行求解。