最大搜索二叉树

本博客转载自:https://blog.csdn.net/jingsuwen1/article/details/51920731
题目描述:给定一颗二叉树,已知其中所有节点的值都不一样,找到含有节点最多的二叉搜索树,并返回头节点。
注:一个二叉树的子树的叶节点必须是该二叉树的叶节点。
解答:以节点root为头的树中,最大的二叉搜索树只可能来自以下两种情况。
1.如果来自root左子树上的最大ST以root.left为头,来自root右子树上的最大ST以root.right 为头,且左边BST的最大值小于root.val,且右边BST的最小值大于root.val。那么,以节点root为根节点的正棵树都是ST。
2.不满足条件1的话,以root为根的树的最大ST是来自左子树的最大ST和右子树的最大ST中包含节点树较多的那一个。
通过以上分析,求解过程如下:
1.整体过程是二叉树的后序遍历。
2.用一个数组recorder记录相关数据。
实现代码如下:

struct TreeNode {//树结点int val;struct TreeNode* left;struct TreeNode* right;TreeNode(int x): val(x), left(NULL), right(NULL) {}
};class Solution {//最大搜索二叉树解决方案
public:struct TreeNode* biggestSubBST(struct TreeNode *root) {if (root == NULL)return NULL;int recorder[3];//记录二叉树的节点个数,最大值和最小值  return postorder(root, recorder);}struct TreeNode* postorder(struct TreeNode *root, int recorder[3]) {if (root == NULL){recorder[0] = 0;recorder[1] = INT_MAX;recorder[2] = INT_MIN;return NULL;}struct TreeNode* left = postorder(root->left, recorder);int lsize = recorder[0];int lmax = recorder[1];int lmin = recorder[2];struct TreeNode* right = postorder(root->right, recorder);int rsize = recorder[0];int rmax = recorder[1];int rmin = recorder[2];if (root->left == left && root->right == right && root->val > lmax && root->val < rmin) {recorder[0] = lsize + rsize + 1;recorder[1] = rmax;recorder[2] = lmin;return root;}else {if (lsize > rsize) {recorder[0] = lsize;recorder[1] = lmax;recorder[2] = lmin;return left;}else {recorder[0] = rsize;recorder[1] = rmax;recorder[2] = rmin;return right;}}}
};

【To Do 难点】最大搜索二叉树相关推荐

  1. 链表问题15——将搜索二叉树转换成双向链表

    题目 将一颗搜索二叉树按照中序遍历(左-中-右)的顺序,变成一个有序的双向链表. 所谓的先序遍历.中序遍历和后序遍历都针对的是中间的节点也就是根节点,先序遍历为中-左-右,后序遍历为左-右-中 思路 ...

  2. 判断一个数列是不是搜索二叉树后续遍历输出的结果

    剑平面阿里被问到这个,刚开始画了下看有什么性质,乱蒙了几个都被推翻了,初始感觉就是要O(n)的,因为印象中BST的构树都可以O(nlogn)搞定.然后剑平说最后一个数肯定是根节点,一下反应过来了,就是 ...

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

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

  4. 判断一棵二叉树是否为搜索二叉树、完全二叉树、平衡二叉树(java)

    平衡二叉树的解法:主要是求出二叉树的高度,若根节点的左子树的高度与右子树的高度差小于等于1,则表示该二叉树为平衡二叉树 public static class Node{public int valu ...

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

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

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

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

  7. 通过有序数组生成平衡搜索二叉树

    题目:给定一个有序数组sortArr,已知其中没有重复值,用这个有序数组生成一颗平衡搜索二叉树,并且该搜索二叉树中序遍历的结果与sortArr一致 思路:用有序数组最中间的数生成搜索二叉树的头节点,然 ...

  8. 根据后续数组重建搜索二叉树

    题目: 给定一个整型数组arr,已知其中没有重复值,判断arr是否可能是节点值类型为整型的搜索二叉树后续遍历的结果 思路:根据搜索二叉树的性质,比后续数组最后一个元素值小的数组会在数组的左边,比数组最 ...

  9. 将搜索二叉树转换成双向链表

    题目: 对二叉树的节点来说,有本身的值域,有指向左孩子和右孩子的两个指针:对双向链表的节点来说,有本身的值域,有指向上一个节点和下一个节点的指针.在结构上,两种结构有相似性,现在有一棵搜索二叉树,请将 ...

最新文章

  1. 一篇与众不同的 String、StringBuilder 和 StringBuffer 详解
  2. RxJava 从源码到使用
  3. ps一点等于多少厘米_50寸液晶电视尺寸是多少
  4. SVN如何将版本库url访问地址中的https改为http
  5. 1.18.Table API SQL(概念、依赖图、Table程序依赖、扩展依赖)
  6. 照片尺寸大小对照表_贴片led灯珠型号对照表在手,贴片灯珠选型从此不愁!
  7. Redis笔记(一)
  8. nsautoreleasepool研究
  9. 直流电机调速c语言程序,分享一个51单片机直流电机调速源程序
  10. 量化策略回测01双均线
  11. 由前序遍历和中序遍历确定二叉树
  12. 第二十二周微职位puppet
  13. [arduino]-序言:面向仅有C语言基础之人的单片机开发板
  14. [CERC2017]Intrinsic Interval(神仙+线段树)
  15. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_10_字节输入流一次读取一个字节的原理...
  16. 微信8.0下载(可抓包)
  17. Unity角色动画详细学习记录
  18. reg型变量怎么赋值_FPGA的wire和reg类型变量
  19. 单幅散焦图像的深度恢复
  20. Centos安装Perl

热门文章

  1. ubuntu14.04+CUDA7.5+cuDNN+caffe的超详细完整配置
  2. python 移除列表中的值 list index out of range_重拾Python(二)之列表
  3. (2)通过输入参数(测量数据)构建三维体模型(01)
  4. Linux启动nacos成功日志_nacos初体验踩坑与填坑篇
  5. Ubuntu18.04下解决Qt出现qt.qpa.plugin:Could not load the Qt platform plugin “xcb“问题
  6. c中的结构体嵌套问题_C中的结构
  7. Python OrderedDict
  8. mongodb find_MongoDB find()
  9. maven依赖冲突解决_Maven依赖树–解决冲突
  10. C++移动构造函数以及move语句简单介绍