1.用递归找树左下角的值
2.路径总和
1.找树左下角的值
此题较简单,保证优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。关键在于对回溯的理解:
dep++;
dfs(root.left,dep);
dep--;//回溯操作
这一段也可以改成这样:
dfs(root.left,dep++);
这样的回溯操作只是被隐藏了,dep值也是不会改变的,只是加了传入的递归的值加了1。
这是完整代码:
class Solution {
private int res = 0;
private int depth = -1;
public int findBottomLeftValue(TreeNode root) {
res = root.val;
dfs(root,0);
return res;
}
public void dfs(TreeNode root , int dep){
if(root.left == null && root.right == null){
if(dep > depth){
res = root.val;
depth = dep;
}
}
//左
if(root.left != null){
dep++;
dfs(root.left,dep);
dep--;//回溯操作
}
//右
if(root.right != null){
dep++;
dfs(root.right,dep);
dep--;//回溯操作
}
}
}
2.路径总和
这道题我直接ac了,发现和答案差不多
class Solution {
private boolean flag = false;
public boolean hasPathSum(TreeNode root, int targetSum) {
if(root == null) return false;
if(root.left == null && root.right == null && targetSum - root.val == 0){
flag = true;
}
if(root.left != null) flag = flag || hasPathSum(root.left , targetSum - root.val);
if(root.right != null) flag = flag || hasPathSum(root.right , targetSum - root.val);
return flag;
}
}
与上题的思路一样,只是多了个路径收集“装置”。
class Solution {
public List<List<Integer>> pathSum(TreeNode root, int targetSum) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) return res;
List<Integer> path = new LinkedList<>();
dfs(root, targetSum ,path,res);
return res;
}
public void dfs(TreeNode root ,int target , List<Integer> path ,List<List<Integer>> res){
path.add(root.val);
if(root.left == null && root.right == null){
if(target - root.val == 0) res.add(new ArrayList<>(path));
return;
}
if(root.left != null){
dfs(root.left,target-root.val,path,res);
path.remove(path.size()-1);
}
if(root.right != null){
dfs(root.right,target-root.val,path,res);
path.remove(path.size()-1);
}
}
}