给定一颗二叉树的头节点head,返回这棵二叉树中最大的二叉搜索子树
(二叉搜索树:该二叉树中左子树所有节点比它小,右子树所有节点比它大 );

思路:
这是一道分析可能性求解在二叉树上做类似动态规划的问题(树形dp),这种题就是一种递归套路,我们要分析求解的可能性,并由此找到我们所需要的信息,进而通过递归求解;

这道题有两种可能性:
1,与头节点无关
所需信息:
1.1,左树最大二叉搜索树大小
1.2,右树最大二叉搜索树大小
2,与头节点有关
所需信息:
2.1,左树为二叉搜索树
2.2,右树为二叉搜索树
2.3,左树节点的最大值max<x<右树节点的最小值min

由此我们可以知道我们所需要的信息info:
1,最大搜索树的大小maxSubBSTSize;
2,布尔类型判断是否为二叉搜索树isAllBST;
3,最大值max和最小值min

代码如下:

class Node{public:int val;Node* left;Node* right;
};
class info{private:int MaxSubBSTSize;bool isAllBST;int Max;int Min;public:info(int Maxsize, bool is, int ma, int mi){this->MaxSubBSTSize=Maxsize;this->isAllBST=is;this->Max=ma;this->Min=mi;}info process(Node* root){if(!root)return NULL;info leftInfo=process(root->left);info rightInfo=process(root->right);int Max=root->val;int Min=root->val;if(leftInfo){Min=min(Min,leftInfo.Min);Max=max(Max,leftInfo.Max);}if(rightInfo){Min=min(Min,rightInfo.Min);Max=max(Max,rightInfo.Max);}int MaxSubBSTSize=0;if(leftInfo){MaxSubBSTSize=leftInfo.MaxSubBSTSize;}if(rightInfo){MaxSubBSTSize=max(MaxSubBSTSize,rightInfo.MaxSubBSTSize);}bool isAllBST=false;if(   (!leftInfo?true:leftInfo.isAllBST)&&(!rightInfo?true:rightInfo.isAllBST)&&(!leftInfo?true:leftInfo.max<root->val)&&(!rightInfo?true:rightInfo.min>root->val)){MaxSubBSTSize=(!leftInfo?0:leftInfo.MaxSubBSTSize)+(!rightInfo?0:rightInfo.MaxSubBSTSize)+1;this->isAllBST=true;}return new Info(MaxSubBSTSize,isAllBST,max,min);}
};

注:代码用到了一些java语法,c++无法正常运行

最大搜索二叉子树大小(树形dp)相关推荐

  1. Educational Codeforces Round 67 (Rated for Div. 2)(D思维题 线段树/E树形dp(换根dp) 二次扫描与换根法)

    心得 D写了个假算法被hack了wtcl- E据涛神说是二次扫描与换根法,看了看好像和树形dp差不多 F概率dp G费用流 回头再补 思路来源 马老师 归神 贤神等代码 http://www.mami ...

  2. [XSY] 绿色(圆方树、树形DP、树上差分)

    绿色 题意简述 题解 首先,每次修改完点权后,重新考虑一遍所有路径显然是不现实的,所以我们考虑求出经过每个点的两端同色的简单路径数,这样权值和容易统计和修改. 接下来分析仙人掌上的简单路径性质.一条简 ...

  3. 1424 零树 (树形DP)

    1424 零树 题意 给出一棵树,每次可以选择一个包含节点 1 的连通块,将所有的节点的权值同时加 1 或减 1 ,问最少多少次操作使所有节点权值变为 0 . 分析 这种题意简单的题目好处就是能很快知 ...

  4. 青云的机房组网方案(简单+普通+困难)(虚树+树形DP+容斥)

    题目链接 1.对于简单的版本n<=500, ai<=50 直接暴力枚举两个点x,y,dfs求x与y的距离. 2.对于普通难度n<=10000,ai<=500 普通难度解法挺多 ...

  5. 石油大 Contest1777 - 2019年第二阶段我要变强个人训练赛第九场 I 热狗树(树形dp)

    题目描述 "我是番茄酱!" "我是黄芥末酱!" "合在一起就是--美式热狗上加的,那个!" 热狗树上的每个节点都涂有番茄酱或者黄芥末酱中的一 ...

  6. P4383 [八省联考2018]林克卡特树(树形dp+wqs二分)

    [八省联考2018]林克卡特树 题目大意:给定一棵有负权边的树,现在必须恰好删去 k k k条边,并加上恰好 k k k条权值为 0 0 0的边,要求最大化它的直径长度. 首先考虑删去 K K K条边 ...

  7. P3287-[SCOI2014]方伯伯的玉米田【二维树状数组,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P3287 题目大意 nnn个玉米高度不同,可以选择kkk个区间拔高111个高度,求最长不降子序列长度. 解题思路 显 ...

  8. #基环树,树形dp#洛谷 2607 JZOJ 1723 骑士

    题目 有环的没有上司的舞会 分析 那么有环那就不是树形dp了,如何处理环,可以先连起来,树形dp,再把环断掉,再跑一次树形dp,两次的最大值即为答案 代码 #include <cstdio> ...

  9. [2020-11-23 contest]图(dfs剪枝),劫富济贫(字典树),小A的树(树形DP),游戏(贪心/斜率优化)

    文章目录 T1:图 solution code T2:劫富济贫 solution code T3:小A的树 solution code T4:游戏 solution code T1:图 [问题描述] ...

最新文章

  1. Proc-fs 编程
  2. ProtoBuffer由.proto文件生成.cc/.h
  3. 本周日,王海峰、朱军、李宏毅等大咖邀你加入这场AI开发者盛宴
  4. JVM优化原理—Java架构师必须要知晓的知识
  5. Android之ActionBar常用设计和使用总结
  6. 编写程序,对用户输入的n个整数,统计其最大数、最小数和平均值
  7. L1-069 胎压监测 (15 分)
  8. python selenium不启动浏览器 爬取数据的方法
  9. AngularJs学习日记[8]:$http
  10. windows 系统文件 —— 特殊文件及文件类型
  11. 丢失更新的问题产生和解决
  12. C# 人民币大小写转换正则表达式
  13. python声音报警_python:基于tkinter打造的股票实时监控声音报警器! 自动监控,声音警报...
  14. B站晚会为什么被夸疯了?答案飘在84万条弹幕中……
  15. CUDA编程1--GPU内存模型
  16. 如何在Word中排出漂亮的代码,去除回车符,去除拼写检查
  17. WIN_DOS经典大全
  18. 西安市商品住房销售公示平台和价格公示
  19. linux中将文本中的单词换掉的指令_干货:Linux常用命令全称及讲解
  20. 数学故事在小学数学课堂教学中的应用研究

热门文章

  1. kvm虚拟机_通过QEMU-GuestAgent实现从外部注入写文件到KVM虚拟机内部
  2. 网络管理员在预先分配和识别作为_14个网络管理员必备的最佳网络流量分析工具,收藏了...
  3. 数据中心基础设施建设方案
  4. Python编程语言学习:python中与数字相关的函数(取整等)、案例应用之详细攻略
  5. Bug总结:python语言中出现的import error错误的解决思路
  6. TF之DNN:TF利用简单7个神经元的三层全连接神经网络【2-3-2】实现降低损失到0.000以下
  7. Py之pipenv:Python包的管理利器pipenv简介、安装、使用方法详细攻略
  8. SSH免密码登录命令无法生效?直接复制粘贴也可以!
  9. 使用Mapping实现的以太坊智能合约的代码
  10. mac 下idea光标问题