110. 经过昨天的苦难磨砺,今天似乎有点进步。这题要注意的是每个结点直接的高度差不能超过1,而不是只比较left和right的高度差!思路的话还是后序遍历,在遍历的时候要加个判断条件如果当前有节点的高度差超过1了则直接返回-1;
class Solution {
public boolean isBalanced(TreeNode root) {
return dfs(root) != -1; // 如果子树是平衡的,dfs返回的是高度;不平衡则返回-1
}
public int dfs(TreeNode root){
if(root==null) return 0;
int leftHeight = dfs(root.left);
if(leftHeight == -1) return -1; // 左子树不平衡
int rightHeight = dfs(root.right);
if(rightHeight == -1) return -1; // 右子树不平衡
if(Math.abs(leftHeight-rightHeight) > 1) return -1; // 当前节点不平衡
return Math.max(leftHeight, rightHeight)+1; // 返回当前节点的高度
}
}
257. 首先,感谢carl大佬的视频讲解才让我半懂的写出来这道题目🤣,有点难度兄弟们, 这是简单题?LeetCode:257. 二叉树的所有路径https://www.bilibili.com/video/BV1ZG411G7Dh/?vd_source=8e2358f9b27440129acde1350d40c3cb
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
dfs(root, res, path);
return res;
}
public void dfs(TreeNode root, List<String> res, List<Integer> path){
//前序遍历:中
//中放在这里,是为了最后path中可以加入最后的叶子结点!
//中放到了递归终止条件的前面,所以下面递归root时要检查是否为空
path.add(root.val);
//递归终止条件,到达叶子结点
if(root.left==null && root.right==null){
StringBuilder sb = new StringBuilder();
//注意:这里只到path.size()-1,留出最后一个字符单独加入,不然最后会多加一个箭头“->”
for(int i = 0; i < path.size()-1; i++){
sb.append(path.get(i)).append("->");
}
sb.append(path.get(path.size()-1));//加入最后一个字符
res.add(sb.toString()); // 加入一条路径
}
//左
if(root.left != null){
dfs(root.left, res, path);
path.remove(path.size()-1); // 回溯
}
//右
if(root.right != null){
dfs(root.right, res, path);
path.remove(path.size()-1); // 回溯
}
}
}
404. 好晕,做不明白,给我做暴躁😡了真的烦。
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) return 0;
int leftValue = sumOfLeftLeaves(root.left); // 左
int rightValue = sumOfLeftLeaves(root.right); // 右
int midValue = 0;
if (root.left != null && root.left.left == null && root.left.right == null) {
midValue = root.left.val;
}
int sum = midValue + leftValue + rightValue; // 中
return sum;
}
}