剑指 offer 树算法题:二叉树中和为某一值的路径

题目描述:输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。

分析:

        深度优先搜素(dfs)法,枚举每一条从根节点到叶子节点的路径。当我们遍历到叶子节点,且此时路径和恰为目标和时,就找到了一条满足条件的路径。路径是根节点开始到叶节点结束的,目的是需要找出的所有符合条件(即路径节点和等于给定整数)的路径。一般考虑使用DFS(深度优先搜索),对于新每个节点:

  1. 新节点进栈;
  2. 当前节点是叶节点且路径和等于目标值,加入路径数组;
  3. 遍历左子树和右子树,目标值减少为target - val;
  4. 递归出来后,回退到该节点的上层(新节点出栈)。

求解:

// 深度优先搜素(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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫96

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值