1.路径和问题
力扣112路径总和
判断二叉树中是否存在和为target的路径
class Solution
{
public boolean hasPathSum(TreeNode root, int targetSum)
{
if(root==null) return false;
if(root.left==null&&root.right==null) return targetSum==root.val;
return hasPathSum(root.left,targetSum-root.val)||hasPathSum(root.right,targetSum-root.val);
}
}
力扣113 二叉树中和为target的路径,也叫路径总和||
找出二叉树中所有和为target的路径
class Solution
{
List<List<Integer>> result=new ArrayList<List<Integer>>();
List<Integer> temp=new ArrayList();
public List<List<Integer>> pathSum(TreeNode root, int sum)
{
//枚举每一条从根节点到叶子节点的路径。当我们遍历到叶子节点,且此时路径和恰为目标和时,我们就找到了一条满足条件的路径
dfs(root,0,sum);
return result;
}
//num是目前已经累加得到了多少,sum是最后总和需要为多少
public void dfs(TreeNode root,int num,int sum)
{
if(root==null) return;
num=num+root.val;
temp.add(root.val);
if(num==sum&&root.left==null&&root.right==null)
{
result.add(new ArrayList(temp));
}
dfs(root.left,num,sum);
dfs(root.right,num,sum);
temp.remove(temp.size()-1);//删除集合最后一个元素
}
}
2.找出所有路径
力扣257 二叉树的所有路径
核心:非叶子节点 temp+root.val+"->"
叶子节点 temp+root.val
class Solution
{
//结果列表里面存的是多个字符串
ArrayList<String> result=new ArrayList();
public List<String> binaryTreePaths(TreeNode root)
{
dfs(root,"");
return result;
}
public void dfs(TreeNode root,String temp)
{
if(root==null) return;
dfs(root.left,temp+root.val+"->");
dfs(root.right,temp+root.val+"->");
//到叶子节点就只需把这个数字添加到temp字符串中,而不需要加上->符号
if(root.left==null&&root.right==null)
{
result.add(temp+root.val);
}
}
}