二叉树问题---在二叉树中找到累加和为指定值的最长路径长度
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实现的代码
给定一棵二叉树的头节点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)
相关文章推荐
- 二叉树系列---找到累加和为指定值的最长路径长度
- 在二叉树中找到累加和为指定值的最长路径长度
- 在二叉树中找到累加和为指定值的最长路径长度
- 二叉树的最长的路径长度和最大路径和
- 算法题15 二叉树的最长的路径长度&&最大路径和
- 求二叉树中的第一条最长路径长度,并输出最长路径上的节点
- 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
- 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
- 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
- 二叉树最长路径问题
- 解决安装驱动程序时提示“Windows已经找到设备的驱动程序,但在试图安装它时遇到错误”“系统找不到指定路径”问题。
- vs2010制作安装包文件出现未能在指定路径下找到系统必备(Bootstrapper)的问题
- 算法题15 二叉树的最长的路径长度&&最大路径和
- java--数据结构--二叉树根节点到指定节点的路径
- linux 安装VMware问题解决-解决ubuntu上VMware: Gtk-WARNING **: 无法在模块路径中找到主题引擎:“murrine
- 字符串操作问题:查找给定字符串中,连续重复且长度最长的第一个子串
- 查找二叉树中最长的连续白色节点的长度
- 【Leetcode】二叉树简单路径最大和问题
- 未排序数组中累加和为指定值得最长子数组序列问题
- Maven项目pom.xml文件报xxx\target\classes\META-INF\MANIFEST.MF (系统找不到指定的路径)问题