树的求和属于树的题目中比較常见的,由于能够有几种变体,灵活度比較高,也能够考察到对于树的数据结构和递归的理解。

一般来说这些题目就不用考虑非递归的解法了(尽管事实上道理是跟LeetCode总结 -- 树的遍历篇一样的。仅仅要掌握了应该没问题哈)。

LeetCode中关于树的求和有下面题目:
Path Sum
Path Sum II
Sum Root to Leaf Numbers
Binary Tree Maximum Path Sum

我们先来看看最常见的题目Path Sum。这道题是推断是否存在从根到叶子的路径和跟给定sum同样。树的题目基本都是用递归来解决,主要考虑两个问题:
1)怎样把问题分治成子问题给左子树和右子树。

这里就是看看左子树和右子树有没有存在和是sum减去当前结点值得路径。仅仅要有一个存在。那么当前结点就存在路径。

2)考虑结束条件是什么。这里的结束条件一个是假设当前节点是空的。则返回false。

还有一个假设是叶子,那么假设剩余的sum等于当前叶子的值。则找到满足条件的路径,返回true。

想清楚上面两个问题,那么实现起来就是一次树的遍历,依照刚才的分析用參数或者返回值传递须要维护的值。然后依照递归条件和结束条件进行返回就可以。算法的时间复杂度是一次遍历O(n),空间复杂度是栈的大小O(logn)。
对于Path Sum II。事实上思路和Path Sum是全然一样的。仅仅是须要输出全部路径,所以须要数据结构来维护路径,加入两个參数,一个用来维护走到当前结点的路径,一个用来保存满足条件的全部路径,思路上递归条件和结束条件是全然一致的。空间上这里会依赖于结果的数量了。

Sum Root to Leaf Numbers这道题多了两个变化,一个是每个结点相当于位上的值。而不是本身有权重。只是事实上没有太大变化。每一层乘以10加上自己的值就能够了。

还有一个变化就是要把全部路径累加起来,这个事实上就是递归条件要进行调整,Path Sum中是推断左右子树有一个找到满足要求的路径就可以,而这里则是把左右子树的结果相加返回作为当前节点的累加结果就可以。

变化比較大并且有点难度的是Binary Tree Maximum Path Sum,这道题目的路径要求不再是从根到叶子的路径,这个题目是把树全然看成一个无向图。然后寻找当中的路径。想起来就认为比上面那种麻烦很多。只是细致考虑会发现还是有章可循的,找到一个根节点最大路径。无非就是找到左子树最大路径,加上自己的值,再加上右子树的最大路径(这里左右子树的路径有可能不取,假设小于0的话)。我们要做的事情就是对于每个结点都做一次上面说的这个累加。而左子树最大路径和右子树最大路径跟Path Sum II思路是比較相似的。尽管不一定要到叶子节点,只是标准也非常easy,有大于0的就取,假设走下去路径和小于0那么就不取。

从分治的角度来看,左右子树的最大路径就是取自己的值加上Max(0,左子树最大路径。右子树最大路径)。这么一想也就不用考虑那么多细节了。

而通过当前节点的最长路径则是自己的值+Max(0,左子树最大路径)+Max(0,右子树最大路径)。

所以整个算法就是维护这两个量,一个是自己加上左或者右子树最大路径作为它的父节点考虑的中间量。还有一个就是自己加上左再加上右作为自己最大路径。详细的实现能够參见Binary Tree Maximum Path Sum

这篇总结主要讲了LeetCode中关于树的求和的题目。

整体来说,求和路径有下面三种:(1)根到叶子结点的路径。(2)父结点沿着子结点往下的路径。(3)随意结点到随意结点(也就是看成无向图)。

这几种路径方式在面试中常常灵活变化,不同的路径方式处理题目的方法也会略有不同,只是最复杂也就是Binary Tree Maximum Path Sum这样的路径方式。仅仅要考虑清楚仍然是一次递归遍历的问题哈。

LeetCode总结 -- 树的求和篇的更多相关文章

  1. LeetCode总结 -- 树的性质篇

    树的性质推断是树的数据结构比較主要的操作,一般考到都属于非常easy的题目,也就是第一道入门题.面试中最好不能有问题,力求一遍写对.不要给面试官不论什么挑刺机会.LeetCode中关于树的性质有下面题 ...

  2. LeetCode总结 -- 树的遍历篇

    遍历树的数据结构中最常见的操作. 能够说大部分关于树的题目都是环绕遍历进行变体来解决的. 一般来说面试中遇到树的题目是用递归来解决的, 只是假设直接考察遍历. 那么一般递归的解法就过于简单了. 面试官 ...

  3. LeetCode刷题总结-数组篇(中)

    本文接着上一篇文章<LeetCode刷题总结-数组篇(上)>,继续讲第二个常考问题:矩阵问题. 矩阵也可以称为二维数组.在LeetCode相关习题中,作者总结发现主要考点有:矩阵元素的遍历 ...

  4. POJ 2823 Sliding Window 线段树区间求和问题

    题目链接 线段树区间求和问题,维护一个最大值一个最小值即可,线段树要用C++交才能过. 注意这道题不是求三个数的最大值最小值,是求k个的. 本题数据量较大,不能用N建树,用n建树. 还有一种做法是单调 ...

  5. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  6. LeetCode刷题总结-数组篇(上)

    数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...

  7. LeetCode刷题总结-数组篇(下)

    本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ...

  8. 【LeetCode】树(共94题)

    [94]Binary Tree Inorder Traversal [95]Unique Binary Search Trees II (2018年11月14日,算法群) 给了一个 n,返回结点是 1 ...

  9. LeetCode:树专题

    树专题 参考了力扣加加对与树专题的讲解,刷了些 leetcode 题,在此做一些记录,不然没几天就没印象了 力扣加加-树专题 总结 树的定义 // Definition for a binary tr ...

随机推荐

  1. 排查sqoop报错:Error running child : java.lang.OutOfMemoryError: Java heap space

    报错栈: -- ::, INFO [main] org.apache.hadoop.mapred.MapTask: Processing split: = AND = -- ::, INFO [mai ...

  2. mongodb,redis,memcached,mysql对比

    1.性能都比较高,性能对我们来说应该都不是瓶颈总体来讲,TPS方面redis和memcache差不多,要大于mongodb 2.操作的便利性memcache数据结构单一redis丰富一些,数据操作方面 ...

  3. vc预处理

    VC 编译命令开关 vc可以可以通过Settings -->Project-->C/C++-->Customize来设置这个编译开关 /C:在预处理输出中保留注释语句 /c:只编译, ...

  4. Matlab中下标,斜体,及希腊字母的使用方法

    下面是Matlab官方列出来的Tex代码列表,包含了绝大部分的希腊字母和数学符号. Character Sequence Symbol Character Sequence Symbol Charac ...

  5. go语言基础之全局变量

    1.全局变量 示例: package main import "fmt" func test() { fmt.Println("test a =", a) } ...

  6. docker仓库操作

    1.登陆注册 docker login 2.搜索镜像 docker search xxx 3.上传镜像 docker push 镜像名:标签或者镜像ID 4.下载镜像 docker pull 镜像名: ...

  7. c#中this的用法

    在C#中,this关键字代表当前实例,我们可以用this.来调用当前实例的成员方法,变量,属性,字段等; 也可以用this来做为参数状当前实例做为参数传入方法. 还可以通过this[]来声明索引器 下 ...

  8. Android -- 经验分享(三)

    目录 获取系统版本号 获取系统信息 获取安装路径和已安装程序列表 获取图片.应用名.包名 解决listview上Item上有按钮时item本身不能点击的问题 不让文本框输入中文 获取屏幕宽高 将Tab ...

  9. UVA 11367 Full Tank?(bfs最短路)

    n个点m条无向边的图,油箱有上限,每个单位的汽油能走1单位距离,每个城市的油价val[i], 对于每个query,求s到e的最小花费. dp[i][j]表示到达第i个城市,油箱剩余油量j时的最小花费. ...

  10. FrameWork模型中引入宏函数报错解决方法

    如下图在Framework的一个简单维度中加入宏函数 解决办法如下图 step1: step2: PS :Cognos 10.1.1中 在cognos connection中创建数据源,为什么没有od ...