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

一般来说这些题目就不用考虑非递归的解法了(尽管事实上道理是跟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. Android支付接入之Google In-app-Billing

    原文链接:http://www.mobile-open.com/2016/966337.html 因为公司需要接入Google的应用内支付(即Google的in-app Billing V3),接入过 ...

  2. windows下用Xshell远程登录Linux

    1.下载安装Xshell 2.右击打开终端,输入su ->口令切换到root 3.查看虚拟机IP 输入命令:ifconfig 若提示not found ,输入/sbin/ifconfig (ex ...

  3. [翻译] SFRoundProgressCounterView 带有进度显示的倒计时视图

    SFRoundProgressCounterView 带有进度显示的倒计时视图 https://github.com/simpliflow/SFRoundProgressCounterView A c ...

  4. Android API 中文(14) —— ViewStub

    前言 关键字: android.view.ViewStub,版本为Android 2.2 r1 本章翻译来自唐明 ,这里本博负责整理和发布,欢迎其他译者一起参与Android API 的中文翻译行动, ...

  5. FaceBook推出的Android图片加载库-Fresco

    FaceBook推出的Android图片加载库-Fresco 原文链接:Introducing Fresco: A new image library for Android 译者 : ZhaoKai ...

  6. 用mappedbytebuffer实现一个持久化队列【转】

    自从前段时间的一个事故让队列里缓存的大量关键数据丢失后,一直琢磨着弄一个能持久化到本地文件的队列,这样即使系统再次发生意外,我也不至于再苦逼的修数据了.选定使用mappedbytebuffer来实现, ...

  7. c++学习之多态(虚函数和纯虚函数)

    c++是面向对象语言,面向对象有个重要特点,就是继承和多态.继承之前学过了,就是一种重用类的设计方式.原有的类叫父类,或者基类,继承父类的类叫子类.在设计模式中,我们总是要避免继承,推荐用组合.因为继 ...

  8. SQL Server 2005 中实现通用的异步触发器架构 (转)

    在SQL Server 2005中,通过新增的Service Broker可以实现异步触发器的处理功能.本文提供一种使用Service Broker实现的通用异步触发器方法. 在本方法中,通过Serv ...

  9. 关于导出数据库提示 outfile disabled的解决方案

    使用命令mysqldump进行导出数据到本地磁盘,执行该命令的时候不要进入mysql的控制台再使用,这样会报outfiledisabled错误.而是直接使用MYSQL/bin目录下的mysqldump ...

  10. 要点Java20 java.util.Collections

    java.util.Collections 集合帮助类 演示样例程序(JUnit演示) 排序 @Test public void testSort() { List<Integer> de ...