根节点到叶子节点为指定值的路径
剑指 Offer 34. 二叉树中和为某一值的路径——回溯法,DFS
给定一个值,计算所有根节点到叶子节点的节点值之和等于sum的路径
- 和剑指offer34题思路和解答是一样的
public class Solution {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();//用于存储结果
ArrayList<Integer> temp = new ArrayList<Integer>();//用于存储路径
public ArrayList<ArrayList<Integer>> pathSum (TreeNode root, int sum) {
// write code here
dfs(root,sum,0);
return res;
}
public void dfs(TreeNode root,int sum,int cnt){
if(root == null)
return;
temp.add(root.val);
cnt += root.val;
if(root.left == null && root.right == null){
if(cnt == sum){
res.add(new ArrayList<>(temp));
}
}else{
dfs(root.left,sum,cnt);
dfs(root.right,sum,cnt);
}
temp.remove(temp.size() - 1);
}
}
二叉树根节点到叶子节点的所有路径和
- 递归
- 重载一个函数sumNumbers(TreeNode root, int sum)表示计算到root节点为止的sum值
- 当左右子节点都为null时,是叶子节点,返回sum
- 当左或右子节点不为null时,不是叶子节点,递归计算左或右子节点的sum值
public class Solution {
/**
*
* @param root TreeNode类
* @return int整型
*/
public int sumNumbers (TreeNode root) {
// write code here
if(root == null)
return 0;
return sumNumbers(root,root.val);
}
private int sumNumbers(TreeNode root,int sum){
if(root.left == null && root.right == null){
return sum;
}
else{
int res = 0;
if(root.left != null){
res += sumNumbers(root.left,root.left.val + sum * 10);
}
if(root.right != null){
res += sumNumbers(root.right,root.right.val + sum * 10);
}
return res;
}
}
}
最大路径和——这个不会
public class Solution {
/**
*
* @param root TreeNode类
* @return int整型
*/
public int res = Integer.MIN_VALUE;
public int maxPathSum (TreeNode root) {
// write code here
getMax(root);
return res;
}
public int getMax(TreeNode root){
if(root == null)
return 0;
int leftMax = Math.max(0,getMax(root.left));
int rightMax = Math.max(0,getMax(root.right));
res = Math.max(res,Math.max(root.val + Math.max(leftMax,rightMax),root.val + leftMax + rightMax));
return Math.max(leftMax,rightMax) + root.val;
}
}