前言:
路径问题好难 这两天把博客看懂他!!!!
例题:(自己是真的菜 函数递归栈看了好久才明白 在此纪录)
AC:(有迭代的思想 相比于下面的好理解一些)
先看懂这个 了解什么意思 再去看下一种思想
class Solution {
int ans, t;
public int pathSum(TreeNode root, int _t) {
t = _t;
dfs1(root);
return ans;
}
void dfs1(TreeNode root) {
if (root == null) return;
dfs2(root, root.val);
dfs1(root.left);
dfs1(root.right);
}
void dfs2(TreeNode root, int val) {
if (val == t) ans++;
if (root.left != null) dfs2(root.left, val + root.left.val);
if (root.right != null) dfs2(root.right, val + root.right.val);
}
}
AC:(纯递归调用)
package 二叉树;
public class 路径总和 {
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public int pathSum(TreeNode root, int targetSum) {
if (root == null) {
return 0;
}
int ret = rootSum(root, targetSum);
ret += pathSum(root.left, targetSum);
ret += pathSum(root.right, targetSum);
return ret;
}
public int rootSum(TreeNode root, int targetSum) {
int ret = 0;
if (root == null) {
return 0;
}
int val = root.val;
if (val == targetSum) {
ret++;
}
ret += rootSum(root.left, targetSum - val);
ret += rootSum(root.right, targetSum - val);
return ret;
}
}
思想:
1 首先第一种ac代码 思路是先dfs1找所有起点 然后进行dfs2 以此起点查找路径
2 第二种 首先rootsum函数相当于之前的dfs2 也是确立以一个起点 进行查找路径
3 然后第二种方法关于查找起点中采用的方法较第一种有不同,看似只是调用了根 左子树节点 右子树节点 其实不是3次 而是不断地在递归调用 把所有节点都遍历了一次 作为起点 然后进行rootsum查找路径
4 其中rootsum函数 为什么每次都要ret=0赋初值 (其实这样不会和ret累加冲突的) 函数递归栈每一层都会保护现场,保护当前的值,你可以理解为当前节点以及保存好了目前ret的值,然后再出发找其他路径 再res++ 最后再累加上去。
图解实现 pathSum和rootSum 递归过程:
更多过程可见此博主博客:
https://blog.csdn.net/zhangxiaolil/article/details/122295709?spm=1001.2014.3001.5501