[leetcode]_Path Sum I && II

时间:2023-03-09 03:13:20
[leetcode]_Path Sum I && II

都是考查DFS。经典回溯算法,问题在于我对该类型的代码不熟悉,目前以参考别人的代码,然后加上自己的实现为主,通过类似的题目加强理解。

一、给定一棵二叉树,判断是否存在从root到leaf的路径和等于给定值sum,存在返回true,否则返回false。

思路:DFS。

代码:

     private boolean ifExist = false;
public boolean hasPathSum(TreeNode root, int sum) {
dfs(root , sum , 0);
return ifExist;
}
public void dfs(TreeNode node , int sum , int tempSum){
if(node == null) return; tempSum += node.val;
if(node.left == null && node.right == null && tempSum == sum){
ifExist = true;
return;
}
dfs(node.left , sum , tempSum);
dfs(node.right , sum , tempSum); }

网络上的DFS代码写的很流畅:参考一下,希望以后能写出这么流畅、舒服的代码。

     public boolean hasPathSum(TreeNode root, int sum) {
if(root == null) return false; int leftSum = sum - root.val;
if(leftSum == 0 && root.left == null && root.right == null) return true; boolean left = hasPathSum(root.left , leftSum);
boolean right = hasPathSum(root.right , leftSum);
return left || right;
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

二、题目:在上题的基础上,如存在路径,则返回具体路径。

代码:

 public ArrayList<ArrayList<Integer>> pathSum(TreeNode root, int sum) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(); ArrayList<Integer> path = new ArrayList<Integer>();
dfs(root , 0 , sum , path , result);
return result;
} public void dfs(TreeNode node , int tempSum , int sum , ArrayList<Integer> curPath , ArrayList<ArrayList<Integer>> result ){
if(node == null) return; tempSum = tempSum + node.val; if(node.left == null && node.right == null){
if(tempSum == sum){
curPath.add(node.val);
ArrayList<Integer> path = new ArrayList<Integer>(curPath);
//用另一个list来转存一下,以便在后来对curPath的操作不会影响到已经add进result的数据。
result.add(path);
curPath.remove(curPath.size() - 1);
//当前路径被记录后,记得删掉添加到list中的节点,回溯
}
return;
} curPath.add(node.val);
dfs(node.left , tempSum , sum , curPath , result);
dfs(node.right , tempSum , sum , curPath , result);
curPath.remove(curPath.size() - 1);
//该节点的左右节点都已经被访问过了,要删掉在list中该节点的记录,回溯
}

DFS的代码还写的很生硬,需要多加练习。