二叉树问题---在二叉树中找到累加和为指定值的最长路径长度

给定二叉树头节点head和整数sum,求累加和为sum的最长路径长度。思路是生成哈希表记录路径累加和及其最早出现层数,先序遍历二叉树,查找以当前节点结尾的满足条件的路径,更新最长路径长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目】

  给定一棵二叉树的头节点head和一个32位整数sum,二叉树节点值类型为整型,求累加和为sum的最长路径长度。路径是指从某个节点往下,每次最多选择一个孩子节点或者不选所组成的节点链。

【基本思路】

  1. 生成哈希表map,map的作用是记录从head开始的一条路径上的累加和,其中key值表示某个累加和,value表示累加和出现的最早层数。例如,假设某个路径上的节点值为[1, 2, 3, -3, 5],那么map中的记录为[1 : 1, 3 : 2, 6 : 3, 3 : 2, 8 : 5],注意value表示累加和出现的最早层数,所以map中的第四个记录和第二个记录相同,所以第四条记录其实不必要插入,map的记录应该为[1 : 1, 3 : 2, 6 : 3, 8 : 5]。

  2. 在map中添加(0, 0)记录,表示累加和 0 不用任何节点就可以得到。先序遍历二叉树,假设遍历到的当前位置是cur,层数为level,此时的累加和应为cur的父节点的累加和presum加上cur节点的值,即cursum = presum + cur.val。如果(presum + cur.val, level)这个记录已经存在于map中,则不需要再次插入。接下来,我们要做的工作是,判断是否有以cur结尾的路径的累加和 等于题目所给的指定值sum。只需要在map中寻找是否有cursum - sum这个记录即可,如果存在这个记录的话 level - map[cursum - sum]就是满足条件的一个路径长度,使用全局变量更新路径的最大值。

  3. 需要注意的是,在遍历完二叉树的子树要返回到cur的父节点是,需要将map中该节点的记录删去(如果之前插入的话),否则可能出现路径不是自顶向下的情况。

下面是使用python3.5实现的代码

def getMaxLength(root, K):
    def getLengthByPreOrder(root, K, preSum, level, length, map):
        if not root:
            return length
        curSum = preSum + int(root.val)
        if curSum not in map:
            map[curSum] = level
        if curSum-K in map:
            length = max(level - map.get(curSum-K), length)
        length = getLengthByPreOrder(root.left, K, curSum, level+1, length, map)
        length = getLengthByPreOrder(root.right, K, curSum, level+1, length, map)
        if level == map.get(curSum):
            map.pop(curSum)
        return length


    if not root:
        return
    map = {}
    map[0] = 0
    return getLengthByPreOrder(root, K, 0, 1, 0, map)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值