lc1373 求二叉搜索子树的最大键值和

对于一颗二叉树,其必然存在一个子树为二叉搜索树,因为即便没有非叶节点形成二叉搜索树,该树的叶节点也算是二叉搜索树。题目求这些二叉搜索子树所有节点和最大的那个节点和是多少?

二叉树由于其本身先天具备子问题的结构和原问题结构一致这样的特性,所以一般来说用dfs或bfs都是可以解决的。一个问题的解,可以转化成其子问题的解和当前节点之间的关系来求解。

因此对于二叉树的问题要想用递归的思维解决必须明白下列几个问题:
1.递归函数的含义或者返回值是什么?
2.站在当前角度解决当前节点需要知道哪些信息?这些信息决定了我们是要前中后哪种遍历方式,以及递归函数返回什么?

对于本题而言,

若递归函数返回的是当前节点的最大二叉搜索字数节点和,那么对于当前节点,我们只能从左右子树中选择最大的递归结果返回,但这完全没有考虑到是否是二叉搜索树。

若递归函数只是遍历不返回值,对于每个节点我们都去检查是否是二叉搜索树,计算其节点和,用一个全局变量去记录最大的子树和。那么判断是否是二叉搜索树需要一个递归函数,计算节点和需要一个递归函数,这样虽然能做出来那复杂度太高。

我们发现连同遍历过程一共需要三个函数,这三个函数都是要对树进行遍历的,那么能不能一次遍历把这几个需要的信息全都得到呢?一次遍历既能得到节点和也能得到是否是二叉搜索树。如果可以的话,那么对于当前节点我们就可以简化问题,对于当前节点,若其左右子树都是二叉搜索树那么,判断当前节点是否也符合定义,若是更新节点和,更新最大值。若左右子树不是二叉搜索树,则没有必要判断了,直接return。

分别解析一下判断是否是二叉搜索树和求节点和的遍历过程。

1.判断是否是二叉搜索树?
对于当前节点若其左右子树都是二叉搜索树,且当前节点值在左子树最大值和右子树最小值之间,则当前节点向下的子树是二叉搜索树。也就是说我们需要事先知道左右子树的情况。这明显只有后序遍历才能实现该效果。因此递归函数返回当前树的最大值和最小值以及是否是二叉搜索树即可。这样对于当前节点我们就可以直接判断了。边界条件:当节点为空,说明一定是二叉搜索树,最大值初始化成INT_MIN,最小值初始化成INT_MAX。因为只有叶节点才会出现边界情况,那么叶节点必然是二叉搜索树,那么值应该在左子树的最大值和右子树的最小值之间。如果最大值初始化成INT_MAX,那必然不满足,叶节点就不会被当成二叉搜索树了。

2.计算节点和
不管哪种遍历顺序都是可以的,所以可以并在判断二叉搜索树的遍历过程中。

因此该题我们采用后序遍历的方式,递归函数返回四个值,是否是二叉搜索树,树中最大值和最小值是多少,树的节点和是多少。

先递归左右子树,根据左右子树返回的信息来更新当前节点应该返回的四个值是多少。

代码:

class Solution {
public:int res = 0;int maxSumBST(TreeNode* root) {dfs(root);return res;}vector<int> dfs(TreeNode* root){if(!root)return {1,INT_MAX,INT_MIN,0};vector<int> left = dfs(root->left);vector<int> right = dfs(root->right);vector<int> cur = {0,min(left[1],root->val),max(root->val,right[2]),root->val + left[3] + right[3]};if(left[0] && right[0] && root->val > left[2] && root->val < right[1]){cur[0] = 1;res = max(cur[3],res);}return cur;}
};

由 lc1373 总结二叉树题目的做法相关推荐

  1. Day9-2021.1.17-剑指offer的八道二叉树题目的整理。涉及递归调用+广度优先遍历。

    2021年1月17日 时间都去哪了? 今日计划: 1.小学初中的辅导.任务已被安排~ 2.组会 3.剑指offer的二叉树题目 4.图解tcp ip 的内容 今日工作: 1.小学初中的辅导.任务已被安 ...

  2. 一篇文章搞定面试中的二叉树题目(java实现)

    转载:http://www.jianshu.com/p/0190985635eb 最近总结了一些数据结构和算法相关的题目,这是第一篇文章,关于二叉树的. 先上二叉树的数据结构: class TreeN ...

  3. 轻松搞定面试中的二叉树题目

    版权全部,转载请注明出处,谢谢!http://blog.csdn.net/walkinginthewind/article/details/7518888 树是一种比較重要的数据结构,尤其是二叉树.二 ...

  4. leetcode101. 对称二叉树(两种做法)

    一:题目 二:上码 方法一:队列 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *lef ...

  5. 记一次 leetcodeEdit Pro 利用力扣官网调试(二叉树题目)的代码 进行的成功调试

    文章目录 步骤 我在大包里面新建了一个类 TreeNode 这样所有二叉树的题目都能识别到TreeNode这个类(以后不需要重复写了) 把 main方法以及其他用到的函数粘贴到 class Solut ...

  6. 二叉树题目 ----7 前序中序遍历构造二叉树

    前序中序遍历构造二叉树 思路 在前序中找根结点 根据根结点 + 中序,分成左右两棵子树 根据子树长度,把前序分成左右两颗子树 递归处理子树 /*** Definition for a binary t ...

  7. 二叉树题目----6 二叉树的最近公共祖先 AND 二叉树搜索树转换成排序双向链表

    二叉树的最近公共祖先 思路 在左.右子树中分别查找是否包含p或q: 如果以下两种情况(左子树包含p,右子树包含q/左子树包含q,右子树包含p),那么此时的根节点就是最近公共祖先 如果左子树包含p和q, ...

  8. 二叉树题目----5 平衡二叉树 AND 根据二叉树创建字符串

    平衡二叉树 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* ...

  9. 二叉树题目----4 前序遍历重构二叉树 AND 求二叉树中所有结点的个数

    前序遍历重构二叉树 思路 整个二叉树用数组存储 因为先序遍历它先遍历根,再遍历左,左边没有跑完是不会去遍历右边的,所以遍历左子树,就是数组元素每回向后一个,个数-1 遍历右边时,就是数组起始位置+左子 ...

最新文章

  1. 测试进度需要考虑的问题
  2. js 转义成html,js转义html,反转义
  3. c#编译器对byte类型的一些规则 (转)
  4. webpack学习资料
  5. 《高效程序员的修炼》 读书笔记
  6. Java ObjectStreamField getName()方法与示例
  7. jsp网页上实现计算三角形面积小程序
  8. gpg: 找不到有效的 openpgp 数据。_萤火数据|找主播堪比相亲找对象,该如何避免心酸血泪史?...
  9. 关于目前CIM(BIM+GIS)行业的一些看法
  10. Alphabetic Removals(水题)
  11. Java校招基础知识总结(横扫BAT,就业经验交流会演讲稿)
  12. php 中文 验证码,php 验证码 支持中文验证码
  13. 淡墨写韵,不守起承转合
  14. 泛函分析笔记(十七) 弱偏导数
  15. 抓包神器 Charles
  16. kaggle员工离职预测——SVC
  17. 第127讲:Hadoop集群管理之安全模式解析及动手实战学习笔记
  18. 怎么能免费制作自己的微信小程序?
  19. appimage转deb
  20. pyspider 爬取bing壁纸

热门文章

  1. 从校园到职场,学会做个成年人
  2. 闪存、内存涨价贡献大:美光2017财年第二季度营收暴涨58%
  3. JSLint使用教程
  4. 数控机床要采用哪种导轨?
  5. 炉石传说服务器没有位置,3年前的今天,炉石传说服务器被偷了,玩家:根本没这回事...
  6. 苹果试玩基本操作技巧(入门篇)
  7. 服务器系统路由,为主流服务器操作系统配置Ipv6(下
  8. 油烟净化器的应用领域有哪些?
  9. mac如何启用cpu虚拟化_我的天,Windows摇身一变成Mac
  10. 新手必备pr 2021快速入门教程「五」素材预览与基本剪辑