● 110.平衡二叉树
有时间可以看看左的视频
算法讲解036【必备】二叉树高频题目-上-不含树型dp_哔哩哔哩_bilibili
算法讲解038【必备】常见经典递归过程解析_哔哩哔哩_bilibili
判断高度,使用后续遍历。先左再右最后是中。
getHeight那一部分,忘了判断最大高度是否大于1了。
class Solution {
public boolean isBalanced(TreeNode root) {
if(getHeight(root)==-1){
return false;
}else{
return true;
}
}
public static int getHeight(TreeNode root){
if(root == null){
return 0;
}
int left = getHeight(root.left);
if(left == -1) return -1;
int right = getHeight(root.right);
if(right == -1) return -1;
int height = Math.abs(left-right)>1?-1:1+Math.max(left,right);
return height;
}
}
● 257. 二叉树的所有路径
这道题我感觉有些难,一知半解,看了卡尔的题解才会写,主要难点一个是这道题的思路,还有一个就是java的操作,比如StringBuilder的声明,ArrayList的函数,都需要掌握。
他这个终止条件也需要注意,不再是当结点为空就return,而是结点的孩子为空就return,不要想当然。
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> res = new ArrayList<>();
if(root==null){
return res;
}
List<Integer> paths = new ArrayList<>();
traversal(root,paths,res);
return res;
}
public static void traversal(TreeNode root, List<Integer> paths,List<String> res){
paths.add(root.val);
if(root.left==null&&root.right==null){
StringBuilder sb = new StringBuilder();
for(int i = 0;i<paths.size()-1;i++){
sb.append(paths.get(i)).append("->");
}
sb.append(paths.get(paths.size()-1));
res.add(sb.toString());
return;
}
if(root.left != null){
traversal(root.left,paths,res);
paths.remove(paths.size()-1);
}
if(root.right != null){
traversal(root.right,paths,res);
paths.remove(paths.size()-1);
}
}
}
● 404.左叶子之和
看来递归还是难啊,感觉能想出来还是没想出来。
我有个想法,当你遇到递归问题的时候,你先想总体的过程是什么然后再看最最后面的过程又是什么?这样是不是就能想明白了?
多看看吧。
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if(root == null) return 0;
if(root.left==null && root.right==null) return 0;
int leftValue = sumOfLeftLeaves(root.left);
if(root.left!=null&&root.left.left==null&&root.left.right==null){
leftValue = root.left.val;
}//这一部分就算放到rightValue的下面也可以
int rightValue = sumOfLeftLeaves(root.right);
int sum = leftValue+rightValue;
return sum;
}
}