文章目录
二叉树
递归
对于递归类型的题,首先是三点:
- 这个递归函数的功能是什么,怎样调用这个函数,即设计好递归函数的
返回值
和参数列表
- 什么时候应该结束这个递归,它的
边界条件
(出口)是什么 (边界条件) - 在非边界情况时,怎样从第n层转变成第n+1层 (
递推公式
)
递归的一个非常重要的点就是:不去管函数的内部细节是如何处理的,我们只看其函数作用以及输入与输出
104. 二叉树的最大深度
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3
解题思路:
- 明确这个函数的
抽象意义,参数列表
。调用了maxDepth
方法后,他返回的结果是int
类型,代表当前传入进去这个节点的高度
。 - 边界就是当这个传入的节点(
即root
)为null
的时候,应该返回的高度为0。 - 获取最大高度,对于当前这个节点来说,就是这个节点
左节点
的高度和右节点
的高度的最大值+1;
class Solution {
public int maxDepth(TreeNode root) {
if(root == null) return 0; //边界条件
return Math.max(maxDepth(root.left),maxDepth(root.right)) + 1; //获取最大值
}
}
111.二叉树的最小深度
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最小深度 2.
解题思路:
这个题和最大深度一样,都是求左子树的深度和右子树的深度,但是有一个特殊情况就是当左子树的什么或者右子树的深度为0的时候,就只有一半的树了。
class Solution {
public int minDepth(TreeNode root) {
if(root == null) return 0;
int left = minDepth(root.left);
int right = minDepth(root.right);
if(left == 0 || right == 0) return left + right + 1; //特判
return Math.min(left,right) + 1;
}
}
543. 二叉树的直径
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例 :
给定二叉树
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
解题思路:
根据每次递归获得左右子树的深度和来修改max
,从而获得最大直径。找路径还有一道题解法大致一样687. 最长同值路径
class Solution {
int max = 0;
public int diameterOfBinaryTree(TreeNode root) {
if(root == null) return 0;
depth(root);
return max;
}
public int depth(TreeNode root){
if(root == null) return 0;
int left = depth(root.left);
int right = depth(root.right);
max = Math.max(max, left + right); //更新最大直径
return Math.max(left, right) + 1; //求树的高度
}
}
110. 平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
解题思路:
对于这种类型的题,我们需要判断每一个节点的左右节点的高度差是否不超过1,所以可以借助一个辅助函数求高度。
class Solution {
public boolean isBalanced(TreeNode root) {
if(root == null) return true;
//求高度差,并递归它的左节点和右节点
return Math.abs(high(root.left) - high(root.right)) <= 1
&& isBalanced(root.left) && isBalanced(root.right);
}
public int high(TreeNode root){
//求每个节点的高度
if(root == null) return 0;
return Math.max(high(root.left), high(root.right)) + 1;
}
}
222. 完全二叉树的节点个数
给出一个完全二叉树,求出该树的节点个数。
说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。
示例:
输入:
1
/ \
2 3
/ \ /
4 5 6
输出: 6
解题思路:
- 常规解法:直接递归遍历
- 大佬解法
class Solution {
public int countNodes(TreeNode root) {
if(root == null) return 0;
int left = high(root.left);
int right = high