程序员面试金典 --- 4.12求和路径


题目:求和路径

给定一棵二叉树,其中每个节点都含有一个整数数量(该值或正或负)。设计一个算法,打印节点数值总和等于某个给定值的所有路径(求路径数量!)。注意,路径不一定非得从二叉树得根节点或叶节点开始或结束,但是某方向必须向下(只能从父节点指向子节点方向)。

一、思路

1.先用蛮力法解决,只需要查看所有可能得路径。遍历每个节点,用递归法尝试所有向下的路径。并随着递归的进行跟踪路径的和。每当发现路径和等于目标和,答案就+1;用时O(NlogN) 每个点遍历完需要LogN。
2.尝试在蛮力法上优化,蛮力法有很多重复计算。对于像10→5→3→-2这样的路径,遍历10为起点时 5,3,-2会被遍历,遍历5为起点时 3,-2会被遍历,所有3,-2会被重复遍历,理想情况下,我们希望能够对该过程进行重用。
假设,对于数组(10,5,1,2,-1,-1,7,1,2)中,有多少连续的子序列相加等于目标和,比如8.
我们可以转换问题求解,对于每个元素y,我们试图找到符合下面描述的x的值?

如果数组中的每个元素都知道路径的行程和,那么求解问题就容易很多,只需要使用如下的等式,即 r u n n i n g S u m x = r u n n i n g S u m y − t a r g e t S u m runningSum_x =runningSum_y - targetSum runningSumx=runningSumytargetSum 。之后,我们只需要找出满足此公式的x的值即可。
在这里插入图片描述

建立一个键为 r u n n i n g S u m runningSum runningSum,其值为 r u n n i n g S u m runningSum ru

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值