题目描述:输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
分析:
深度优先搜素(dfs)法,枚举每一条从根节点到叶子节点的路径。当我们遍历到叶子节点,且此时路径和恰为目标和时,就找到了一条满足条件的路径。路径是根节点开始到叶节点结束的,目的是需要找出的所有符合条件(即路径节点和等于给定整数)的路径。一般考虑使用DFS(深度优先搜索),对于新每个节点:
- 新节点进栈;
- 当前节点是叶节点且路径和等于目标值,加入路径数组;
- 遍历左子树和右子树,目标值减少为target - val;
- 递归出来后,回退到该节点的上层(新节点出栈)。
求解:
// 深度优先搜素(dfs)法
function pathSum1(root: TreeNode<number> | null, target: number): number[][] {
// 当前遍历的路径
const path: number[] = [];
// 所有满足条件的路径
const result: number[][] = [];
function dfs(root: TreeNode<number> | null, target: number) {
if (root === null) {
return;
}
const { left, right, val } = root;
target = target - val;
path.push(val);
if (left === null && right === null && target === 0) {
// 叶节点的值等于目标值
result.push([...path]);
}
// 递归左右子树
dfs(left, target);
dfs(right, target);
// 递归左右子树将当前节点剔除,保证路径唯一
path.pop();
}
dfs(root, target);
return result;
}