【二叉树-所有路经系列(根->叶子)】二叉树的所有路径、路径总和 II、路径总和、求根到叶子节点数字之和(DFS)

时间:2023-03-09 08:15:40
【二叉树-所有路经系列(根->叶子)】二叉树的所有路径、路径总和 II、路径总和、求根到叶子节点数字之和(DFS)

总述

  • 全部用DFS来做
  • 重点一:参数的设置:为Root,路径字符串,路径List集合。
  • 重点二:步骤:
    • 1 节点为null
    • 2 所有节点的操作
    • 3 叶子结点的操作
    • 4 非叶节点的操作

题目257. 二叉树的所有路径

给定一个二叉树,返回所有从根节点到叶子节点的路径。

例:输出: ["1->2->5", "1->3"]

代码

class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> list = new LinkedList<>();
String s = "";
getPaths(root,s,list);
return list;
} public void getPaths(TreeNode root,String path,List<String> ans){
//1 节点不为null
if(root!=null){
// 2 所有节点的操作
path+=root.val;
// 3 叶子节点的操作
if(root.left==null&&root.right==null){
ans.add(path);
}
else{
//4 非叶节点的操作
path+="->";
getPaths(root.left,path,ans);
getPaths(root.right,path,ans);
}
}
}
}

题目113. 路径总和 II

给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。

题解

  • 步骤同上
  • 此外,注意由于参数path全局只有一份,所以当放入pathList集合时要拷贝再放入。
  • 此外,注意当叶子结点或非叶节点处理完,要path.removeLast()恢复现场。

代码

class Solution {
public List<List<Integer>> pathSum(TreeNode root, int sum) {
List<List<Integer>> pathList = new LinkedList<>();
LinkedList<Integer> list = new LinkedList<>();
getPaths(root,sum,list,pathList);
return pathList;
} public void getPaths(TreeNode root,int sum,LinkedList<Integer> path,List<List<Integer>> pathList){
//1 节点为null
if(root==null){return;} //2 所有节点的操作
sum-=root.val;
path.add(root.val); //3 叶子节点的操作
if(root.left==null&&root.right==null){
if(sum==0){pathList.add(new LinkedList<Integer>(path));}//一定要new
path.removeLast();
}else{
//4 非叶节点的操作
getPaths(root.left,sum,path,pathList);
getPaths(root.right,sum,path,pathList);
path.removeLast();
}
}
}

题目112. 路径总和

给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和。

题解

  • 步骤同上
  • 特别地,回溯方法有返回值,返回值为是否有满足题意的路径。

代码

class Solution {
public boolean hasPathSum(TreeNode root, int sum) {
//1 节点为null
if(root==null){
return false;
} //2 所有节点的操作
sum -=root.val;
//3 叶子节点的操作
if(root.left==null&&root.right==null){
return sum==0;
}
//4 非叶节点的操作
return (hasPathSum(root.left,sum)||hasPathSum(root.right,sum));
}
}

题目 129. 求根到叶子节点数字之和

代码

class Solution {
private int sum; public int sumNumbers(TreeNode root) {
dfs(root,0);
return sum;
} private void dfs(TreeNode root,int pathSum){
if(root ==null){
return ;
}
pathSum=pathSum*10+root.val;
if(root.left==null&&root.right==null){
sum+=pathSum;
}
dfs(root.left,pathSum);
dfs(root.right,pathSum);
}
}