[程序员代码面试指南]二叉树问题-找到二叉树中的最大搜索二叉树(树形dp)
题意
给定一颗二叉树的头节点,已知所有节点的值都不一样,找到含有节点最多的搜索二叉子树,并返回这个树的头节点。
题解
- 在后序遍历过程中实现。
- 求解步骤按树形dp中所列步骤。可能性三种:左子树最大、右子树最大、当前节点为根的树。
- 时间复杂度O(n)
树形dp
使用前提
如果题目求解目标是s规则,则求解流程可以定为以每一节点为根节点的子树在s规则下的每个答案,并且最终答案一定在其中。
步骤
- 可能性。以根、左子树、右子树的角度考虑。
- 列出本层所有需要拿到的变量。左右子树要统一。
- 在递归函数下写:basecase、左右递归、判断可能性、更新要给到上一层的所有变量。
todo
一直未解把用类的子类要怎么搞。子类必须要有实例但OJ测时Main又没实例?
代码
public class ReturnType{
int min;//最小节点值
int max;//最大节点值
int maxSize;//最大BST树的大小
Node maxRoot;//最大BST树的根节点
ReturnType(int min,int max,int maxSize,Node maxRoot){
this.min=min;
this.max=max;
this.maxSize=maxSize;
this.maxRoot=maxRoot;
}
}
public class Main {
public static void main(String args[]) {
//test
Node root=new Node(10);
Node node1=new Node(11);
Node node2=new Node(14);
Node node3=new Node(11);
Node node4=new Node(15);
root.left=node1;
root.right=node2;
node2.left=node3;
node2.right=node4;
int maxSize=getMaxBST(root).maxSize;
System.out.println(maxSize);
}
public static ReturnType getMaxBST(Node root) {
if(root==null) {
return new ReturnType(Integer.MAX_VALUE,Integer.MIN_VALUE,0,null);
}
ReturnType lReturn=getMaxBST(root.left);
ReturnType rReturn=getMaxBST(root.right);
int min=getMin(root.val,lReturn.min,rReturn.min);
int max=getMax(root.val,lReturn.max,rReturn.max);
int maxSize=Math.max(lReturn.maxSize, rReturn.maxSize);
Node maxRoot=maxSize==lReturn.maxSize?lReturn.maxRoot:rReturn.maxRoot;
if(lReturn.maxRoot==root.left&&rReturn.maxRoot==root.right&&lReturn.max<root.val&&rReturn.min>root.val) {//
maxSize=lReturn.maxSize+rReturn.maxSize+1;
maxRoot=root;
}
return new ReturnType(min,max,maxSize,maxRoot);
}
private static int getMin(int... vals) {
int min=Integer.MAX_VALUE;
for(int val:vals) {
if(val<min) {
min=val;
}
}
return min;
}
private static int getMax(int... vals) {
int max=Integer.MIN_VALUE;
for(int val:vals) {
if(val>max) {
max=val;
}
}
return max;
}
}
[程序员代码面试指南]二叉树问题-找到二叉树中的最大搜索二叉树(树形dp)的更多相关文章
- [程序员代码面试指南]递归和动态规划-机器人达到指定位置方法数(一维DP待做)(DP)
题目描述 一行N个位置1到N,机器人初始位置M,机器人可以往左/右走(只能在位置范围内),规定机器人必须走K步,最终到位置P.输入这四个参数,输出机器人可以走的方法数. 解题思路 DP 方法一:时间复 ...
- 程序员代码面试指南 IT名企算法与数据结构题目最优解
原文链接 这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现.针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮 ...
- 左神算法书籍《程序员代码面试指南》——3_05Morris遍历二叉树的神级方法【★★★★★】
[问题]介绍一种时间复杂度O(N),额外空间复杂度O(1)的二叉树的遍历方式,N为二叉树的节点个数无论是递归还是非递归,避免不了额外空间为O(h),h 为二叉树的高度使用morris遍历,即利用空节点 ...
- 程序员代码面试指南:IT名企算法与数据结构题目最优解
第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...
- [程序员代码面试指南]二叉树问题-在二叉树中找到两个节点的最近公共祖先、[LeetCode]235. 二叉搜索树的最近公共祖先(BST)(非递归)
题目 题解 法一: 按照递归的思维去想: 递归终止条件 递归 返回值 1 如果p.q都不在root为根节点的子树中,返回null 2 如果p.q其中之一在root为根节点的子树中,返回该节点 3 如果 ...
- [程序员代码面试指南]数组和矩阵问题-找到无序数组中最小的k个数(堆排序)
题目链接 https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&t ...
- 《程序员代码面试指南》第三章 二叉树问题 Tarjan算法与并查集解决二叉树节点间最近公共祖先的批量查询问题
题目待续.... Tarjan算法与并查集解决二叉树节点间最近公共祖先的批量查询问题 java代码
- 《程序员代码面试指南》第三章 二叉树问题 二叉树按层打印和ZigZag打印
题目 二叉树按层打印和ZigZag打印 java代码 package com.lizhouwei.chapter3; import java.util.LinkedList; import java. ...
- 《程序员代码面试指南》第三章 二叉树问题 遍历二叉树的神级方法 morris
题目 遍历二叉树的神级方法 morris java代码 package com.lizhouwei.chapter3; /** * @Description:遍历二叉树的神级方法 morris * @ ...
随机推荐
- async 函数的含义和用法
Generator函数的含义与用法 Thunk函数的含义与用法 co函数库的含义与用法 async函数的含义与用法 一.终极解决 异步操作是 JavaScript 编程的麻烦事,麻烦到一直有人提出各种 ...
- Storcli64 工具操作指南
1.1 介绍 storcli64可对LSIRAID卡基本操作进行管理,本文主要是对LSIRAID卡常使用到的命令进行介绍 1.2 基本语法 获取控制器号:storcli64 /call show al ...
- windows10永久激活工具 新版win10激活工具(绝对有效的永久激活工具)
来看这篇文章的,都用过KMS了吧?对!KMS是批量激活的,激活时间是一年,如果给女神激活,此法首选呀!!!但是帮基友激活,过了一年又来找自己,作为程序员的你,脸上是不是有点挂不住然后又不想花钱去买某宝 ...
- Object.prototype.__proto__, [[prototype]] 和 prototype
Object.prototype.__proto__ , [[prototype]] 和 prototype Object.prototype.__proto__ 是什么? __proto__ 是一个 ...
- HotSpot的垃圾回收器
如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现.这里讨论的收集器基于JDK 1.7 Update 14之后的 HotSpot 虚拟机,这个虚拟机包含的所有收集器如下图所示 上图 ...
- 送大家几个cnblogs号,供快捷评论,请谨慎使用
欢迎评论& 3461896724@qq.com互动 可以在我的首页看更多 #1先送大家几个号:(密码都是 MLdlight2020)请区分大小写(可以直接复制) 写过一篇 免费验证码接收网站& ...
- WSGI 配置禁止反向DNS查找
原文链接:https://opendev.org/starlingx/ha/src/commit/045a37c672a92f1412629a176f51183c88882e61/service-mg ...
- Robot Framework(8)——脚本语法示例记录
大神写了一个Robot Framework的脚本,好多语法之前没接触过,就有了这篇,记录下来一起学习,欢迎纠错 第二三四五列,一般是入参,红色的表示必填的入参.浅灰色表示选填的入参.深灰色表示无需填写 ...
- Communication-Efficient Learning of Deep Networks from Decentralized Data
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Proceedings of the 20th International Conference on Artificial Intell ...
- 10款人气暴涨的PHP开源工具
若想创建动态而又新颖的Web应用程序,PHP便是理想的选择.不用说,在Web开发世界里,PHP是最流行的语言之一.一些非常好用的PHP开源工具着实拯救了不少开发任务繁重的PHP开发人员,减轻他们的开发 ...