题目: 
  给定一棵二叉树的头节点head,已知其中所有节点的值都不一样,找到含有节点最多的搜索二叉树,并返回这棵子树的头节点。(注意子树的概念)

基本思路: 
以节点node为头的树中,最大的搜索二叉树只可能来自以下的两种情况:  

node的左子树和右子树都是搜索二叉树,并且左子树的最大值小于node,右子树的最小值大于node,此时,以node为头的整棵树都是搜索二叉树。
如果不满足情况1,那么最大的搜索二叉树来自node左子树的最大搜索二叉子树或者node右子树的最大搜索二叉子树

整体过程是二叉树的后序遍历,

过程如下:

遍历到当前节点cur时,先遍历左子树收集四个信息,分别是左子树上最大搜索二叉树的头节点(lBST),节点数(lSize),最大值(lMax)和最小值(lMin)。再遍历右子树,也收集四个信息rBST, rSize, rMax, rMin。
根据步骤一收集的信息,判断是否满足情况1,如果满足,返回cur。如果不满足,返回lBST, rBST中最大的一个。

def getMaxLength(root):if root == None:return record = [root] + [0 for i in range(3)]return process(record)def process(record):import sysif record[0] == None:return [None,0,sys.maxsize,-sys.maxsize]leftData = process(record[0].left)leftSize,leftMax,leftMin = record[1],record[2],record[3]rightData = process(record[1].right)rightSize,rightMax,rightMin = record[1],record[2],record[3]record[1] = max(leftSize,rightSize)record[2] = min(min(leftMax,rightMax),int(root.val))record[3] = max(max(leftMin,rightMin),int(root.val))if rightSize > leftSize:root = rightDataelse:root = leftDataif record[0].left == leftData and record[0].right == rightData and leftMax <= int(record[0].val) and rightMin >= int(record[0].val):record[1] = leftSize + rightSize + 1root = record[0]return [root,record[1],record[2],record[3]]

找到二叉树中的最大搜索子树相关推荐

  1. 找到二叉树中的最大搜索二叉子树

    找到二叉树中的最大搜索二叉子树 给定一棵二叉树的头节点head,已知其中所有节点的值都不一样,找到含有节点最多的搜索二叉子树,并返回这棵子树的头节点. 如果节点数为N,要求时间复杂度为 O(N),额外 ...

  2. 找到二叉树中符合搜索二叉树条件的最大拓扑结构

    找到二叉树中符合搜索二叉树条件的最大拓扑结构 给定一棵二叉树的头节点 head,已知所有节点的值都不一样,返回其中最大的.且符合搜索二叉树 条件的拓扑结构的节点数.这里的拓扑结构是指,你可以在二叉树中 ...

  3. LeetCode 1602. 找到二叉树中最近的右侧节点(BFS)

    文章目录 1. 题目 2. 解题 1. 题目 给定一棵二叉树的根节点 root 和树中的一个节点 u ,返回与 u 所在层中距离最近的右侧节点,当 u 是所在层中最右侧的节点,返回 null . 示例 ...

  4. 二叉树中最大的二叉搜索子树

    问题描述 思路和代码 暴力方法是每个节点为根节点,然后判断以该节点为根节点的树是否是二叉搜索树,然后求规模最大的,这种方式的时间复杂度是O(N2)O(N^2)O(N2),空间复杂度是O(h)O(h)O ...

  5. 在二叉树中找到两个节点的最近公共祖先(C++)

    在二叉树中找到两个节点的最近公共祖先 描述   给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点. 数据范围:树上节点数满足1 ...

  6. 14.相同的树另一棵树的子树检查子树二叉树中的列表(教你们使用相同的套路快速解决这四道题)

    一.相同的树 这道题是开胃菜的开始,使用递归进行解决 递归三部曲: 确定递归函数的参数和返回值 因为我们要比较的是两棵树是否相等,所以参数分别是两棵树的根节点,返回值为boolean类型,即两棵树是否 ...

  7. 调整搜索二叉树中两个错误的节点

    一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回.已知二叉树中所有节点的 值都不一样,给定二叉树的头节点 head,返回一个长度为 ...

  8. 寻找搜索二叉树中两个错误的节点

    题目:一颗二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这颗二叉树不再是搜索二叉树,请找到两个错误节点并返回.已知二叉树中所有节点的值都不一样,给定二叉树的头节点head,返回一个长度为2 ...

  9. 左神算法:调整搜索二叉树中两个错误的节点(Java版)

    本题来自左神<程序员代码面试指南>"调整搜索二叉树中两个错误的节点"题目. 题目 原问题: 一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再 ...

最新文章

  1. Lync客户端导入联系人
  2. AI:2020年6月23日北京智源大会演讲分享之机器学习专题论坛——09:45-10:25邢波教授《A Blueprint of Standardized and Composable ML》
  3. 【yii2调试神器】yii2-debug能力分析和配置项解析
  4. java 返回值void_Java的返回值voidspeak
  5. 判空前后顺序的思考(代码规范)
  6. mac 下用 brew 安装mongodb
  7. leetcode851. 喧闹和富有(dfs)
  8. websocket + node.js聊天系统
  9. 【Pytorch神经网络实战案例】24 基于迁移学习识别多种鸟类(CUB-200数据集)
  10. phylip软件_进化树专题(五)| 密码子分区软件介绍
  11. Windows下memcached.exe的安装与配置
  12. POJ3349 Snowflake Snow Snowflakes(哈希表)
  13. 根据ip地址查找本地时区
  14. 跟开涛老师学shiro -- 身份验证
  15. C程序设计--排序(冒泡、选择、插入)--插入
  16. 如何利用labelImg软件标图
  17. java 托盘 气泡 菜单_C#如何使用NotifyIcon实现任务栏托盘菜单及气泡提示
  18. 运放专题:电压电流转换
  19. 基于SPSS的正态性检验方法汇总——以个股收益率为例(超详细)
  20. 中标麒麟yum源地址

热门文章

  1. HDOJ/HDU 2566 统计硬币(公式~遍历~)
  2. asterisk-通道变量列表
  3. Dos命令删除注册表项
  4. 偏方使用不当担心被毁容! - 生活至上,美容至尚!
  5. 定位ARM Hard Fault 的方法
  6. 全局内存BSS,DATA,RODATA的区别以及其他内存区间相关
  7. 802.11协议精读9:初探节能模式(PS mode)与缓存机制
  8. 《算法竞赛进阶指南》打卡-基本算法-AcWing 99. 激光炸弹:二维前缀和
  9. 汤家凤高等数学2020年强化笔记-第一模块极限与连续与第二模块微分学
  10. 洛谷P1908求逆序对【树状数组】