您的位置:首页 > 编程语言 > Python开发

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

2017-07-31 02:09 447 查看
【题目】

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

【基本思路】

生成哈希表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]。

在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]就是满足条件的一个路径长度,使用全局变量更新路径的最大值。

需要注意的是,在遍历完二叉树的子树要返回到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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 二叉树
相关文章推荐