110.平衡二叉树
参考视频和详解
我的想法
整棵树最大高度和最小高度的差小于等于1,就是平衡二叉树
❌思路问题:
对平衡二叉树的理解错误。平衡二叉树需要在每个节点级别检查子树的高度差,而不仅仅是整棵树的最大和最小高度。
优解思路
1. 什么是平衡二叉树?
二叉树里的任何一个节点,左右子树的高度差不超过1
2. 如何判断是不是平衡二叉树
要判断每一个节点的左右子树高度差是否超过1。当任何一个节点的左右孩子的高度差超过1,就不是平衡二叉树
3. 如何标记左右子树的差值是否大于1?
返回-1
4. 区分高度和深度
高度向上,深度向下
5. 求高度和深度各用什么遍历方式?
高度用后序(左右中),深度用前序(中左右)
代码实现
1. 确定参数和返回值
int getHeight(TreeNode node)
2. 确定终止条件
if(node== null){
return 0
}
3. 确定单层递归逻辑
⚠️要在每个节点处检查高度差
257. 二叉树的所有路径 (没懂)
参考视频和详解
我的想法
前序遍历
每遍历完一遍如何回到根节点?
优解思路
- 前序遍历
- 回溯:解决遍历完回到根节点的问题
每遍历完一遍,把5弹出,把2弹出,回到根节点1,把3加进来
代码实现
1. 确定参数和返回值
List traverse(TreeNode node, List<Integer> path, List<String> result)
path是单条路径,数组类型,地址拷贝
2. 确定终止条件
if(node.left == null && node.right == null) { //说明遍历到叶子节点了
result.append(path);
return result;
}
3. 单层递归逻辑
path.append(node.val); //注意这里要放在终止条件的上面,否则path会漏掉叶子节点
if(node.left != null){ //注意要判断孩子节点是否为空,否则会空指针异常
traverse(node.left, path, result);
path.remove(path.size() - 1); //回溯
}
if(node.right != null){
traverse(node.right, path, result);
path.remove(path.size() - 1); //回溯
}
404.左叶子之和
参考视频和详解
优解思路
后序遍历
难点:以前的二叉树题目是通过节点的孩子判断本节点的属性,这道题要通过父节点判断本节点的属性。即在上一层判断下一层有没有左叶子,要找的是其父节点
- 节点必须是叶子节点,且是父节点的左孩子
- 如何判断节点6是不是我们要收集的元素?
遍历到9,判断9的左孩子6是否为空。如果不为空,且6的左孩子和右孩子都为空,说明6就是要找的左叶子节点 - 后序遍历,收集左子树的左叶子之和,和右子树的左叶子之和,返回上一层
代码实现
1. 确定参数和返回值
int traversal(TreeNode node)
2. 确定终止条件
if(node == null){
return 0;
}
If(node.left == null && node.right == null){
return 0; //遍历到叶子节点时要返回0,因为还不确定是不是左孩子
}
3. 确定单层递归逻辑
int leftNum = traversal(node.left);
if(node.left != null & node.left.left != null & node.left.right != null){
leftNum = node.left.val;
}
int rightNum = traversal(node.right);
int sum = leftNum + rightNum;
return sum;