树形dp套路
我们知道dp也就是动态规划的思想就是先解决小问题,通过不断的解决小问题,最终解决大问题。那么能够应用树形dp套路的题目都应该符合一个条件,那就是通过解决每个子树的小问题,最终解决整棵树的大问题。
套路
- 分析有几种可能
- 需要哪些信息
- 汇总信息,构造
ReturnType - 构造递归函数
找到二叉树中的最大搜索二叉子树
首先,这道题是可以通过先解决小的子树最大搜索二叉子树,然后不断扩大范围,最终解决整棵树的最大搜索二叉子树。
那么分析套路开始:
分析有哪些情况?
第一:最大搜索二叉子树在左子树中
第二:最大搜索二叉子树在右子树中
第三:整颗左子树+头结点+整颗右子树,是一个搜索二叉树
需要哪些信息?
maxBSTHead最大搜索二叉子树的头结点,我们需要返回他maxBSTSize最大搜索二叉子树的大小,我们需要跟其他搜索二叉树比较左子树的最大值,我们需要这个值跟头结点比较
右子树的最小值,我们需要这个值跟头结点比较
合并信息到
ReturnType构造递归函数
首先返回值是
ReturnType,参数为Node,不多说。终止条件仍然要返回一个ReturnType。对于这种套路都是先左右递归,然后根据各种情况为ReturnType的属性赋值。
/**
* 找到二叉树中的最大搜索二叉子树
*
* @author keboom
* @date 2021/5/9
*/
public class FindLargestTree {
class ReturnType {
public Node maxBSTHead;
public int maxBSTSize;
public int min;
public int max;
public ReturnType(Node maxBSTHead, int maxBSTSize, int min, int max) {
this.maxBSTHead = maxBSTHead;
this.maxBSTSize = maxBSTSize;
this.min = min;
this.max = max;
}
}
public ReturnType process(Node X) {
// base case:如果子树是空树
if (X == null) {
return new ReturnType(null, 0, Integer.MAX_VALUE, Integer.MIN_VALUE);
}
// 默认直接得到左树全部信息
ReturnType lData = process(X.left);
// 默认直接得到右树全部信息
ReturnType rData = process(X.right);
// 信息整合
// 求最小值:X,左子树,右子树
int min = Math.min(X.value, Math.min(lData.min, rData.min));
// 求最大值:X,左子树,右子树
int max = Math.max(X.value, Math.max(lData.max, rData.max));
// 如果只考虑可能性一和二,也就是最大搜索二叉树是X的左子树或者右子树
int maxBSTSize = Math.max(lData.maxBSTSize, rData.maxBSTSize);
// 如果只考虑可能性一和二,也就是最大搜索二叉树是X的左子树或者右子树
Node maxBSTHead = lData.maxBSTSize >= rData.maxBSTSize ? lData.maxBSTHead : rData.maxBSTHead;
// 利用收集的信息,可以判断是否存在第三种可能
if (lData.maxBSTHead == X.left && rData.maxBSTHead == X.right
&& X.value > lData.max && X.value < rData.min) {
maxBSTSize = lData.maxBSTSize + rData.maxBSTSize + 1;
maxBSTHead = X;
}
return new ReturnType(maxBSTHead, maxBSTSize, min, max);
}
public Node getMaxBST(Node head) {
return process(head).maxBSTHead;
}
}
判断二叉树是否为平衡二叉树
有哪些情况?
就那一种情况,那就是左树,右树都是平衡二叉树,并且高度差小于等于1
需要哪些信息?
高度,该树是否为平衡
综合信息到
ReturnType构造递归函数
返回值,参数,终止条件不多说了。同样的格式,先是左右递归,然后操作之。我们需要求
ReturnType的属性值,对于树高来说,去左子树和右子树中大的+1即可。对于是否平衡,那么就要求左树和右树都平衡,且高度差小于等于1。
/**
* @author keboom
* @date 2021/5/17
*/
public class IsBalanceTree {
class ReturnType {
public boolean isBalanced;
public int height;
public ReturnType(boolean isBalanced, int height) {
this.isBalanced = isBalanced;
this.height = height;
}
}
public boolean isBalanced(Node head) {
return process(head).isBalanced;
}
private ReturnType process(Node head) {
if (head == null) {
return new ReturnType(true, 0);
}
ReturnType leftData = process(head.left);
ReturnType rightData = process(head.right);
int height = Math.max(leftData.height, rightData.height) + 1;
boolean isBalanced = leftData.isBalanced && rightData.isBalanced
&& Math.abs(leftData.height - rightData.height) < 2;
return new ReturnType(isBalanced, height);
}
}
求二叉树中两节点的最大距离
这题要求从一个二叉树中,我找两个距离最远的点,求最远距离是多少?

这棵树找4和6,距离就是最大的5。当然了找4和7,5和6,5和7都是一样的。

打马赛克的是没有了哦,比如这颗树,4和5那就是距离最大是为3。当然如果左子树更长一些就好了。

当然还有右子树长一点的。
有几种情况?
第一种树比较平衡,那么在左子树,右子树各取一点,那么可能是最大距离
第二种,左子树比较长,右子树比较短,那么从左子树中去两点,可能是最大距离
第三种,右子树长,左子树短,则从右子树取两点
需要哪些信息?
树高,用来计算两点的距离
最长距离,需要进行比较
放到
ReturnType构造递归函数
只说
maxDistance,那就是三种情况中取最大的。
public class ReturnType {
public int maxDistance;
public int height;
public ReturnType(int maxDistance, int height) {
this.maxDistance = maxDistance;
this.height = height;
}
}
public int getMaxDistance(Node head) {
return process(head).maxDistance;
}
private ReturnType process(Node head) {
if (head == null) {
return new ReturnType(0, 0);
}
ReturnType leftData = process(head.left);
ReturnType rightData = process(head.right);
int height = Math.max(leftData.height, rightData.height) + 1;
int maxDistance = Math.max(leftData.height + rightData.height + 1,
Math.max(leftData.maxDistance, rightData.maxDistance));
return new ReturnType(maxDistance, height);
}
树形dp套路的更多相关文章
- 虚树(树形dp套路)模板——bzoj2286
虚树的核心就是把关键点和关键点的lca重新生成一棵树,然后在这棵树上进行dp https://www.cnblogs.com/zwfymqz/p/9175152.html 写的很好的博客 建立虚树的 ...
- CCPC-Wannafly Winter Camp Day1 流流流动 (树形dp)
题目描述 喜欢数学的wlswls最近被萎住了. 现在他一共有1...n1...n这么多数字,取数字ii会得到f[i]f[i]的收益.数字之间有些边,对于所有的i(i != 1)i(i!=1),若ii为 ...
- 树形dp系列
1.火车站开饭店 最大独立集裸题 #include<iostream> #include<cstdio> #include<cstdlib> #include< ...
- 树形dp总结
转自 http://blog.csdn.net/angon823 介绍 1.什么是树型动态规划 顾名思义,树型动态规划就是在"树"的数据结构上的动态规划,平时作的动态规划都是线性的 ...
- 『战略游戏 最大利润 树形DP』
通过两道简单的例题,我们来重新认识树形DP. 战略游戏(luoguP1026) Description Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题.他要 ...
- 树形DP和状压DP和背包DP
树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...
- GDOI2018 滑稽子图 [斯特林数,树形DP]
传送门并没有 思路 见到那么小的\(k\)次方,又一次想到斯特林数. \[ ans=\sum_{T} f(T)^k = \sum_{i=0}^k i!S(k,i)\sum_{T} {f(T)\choo ...
- BZOJ.2159.Crash的文明世界(斯特林数 树形DP)
BZOJ 洛谷 挺套路但并不难的一道题 \(Description\) 给定一棵\(n\)个点的树和\(K\),边权为\(1\).对于每个点\(x\),求\(S(x)=\sum_{i=1}^ndis( ...
- 算法进阶面试题05——树形dp解决步骤、返回最大搜索二叉子树的大小、二叉树最远两节点的距离、晚会最大活跃度、手撕缓存结构LRU
接着第四课的内容,加入部分第五课的内容,主要介绍树形dp和LRU 第一题: 给定一棵二叉树的头节点head,请返回最大搜索二叉子树的大小 二叉树的套路 统一处理逻辑:假设以每个节点为头的这棵树,他的最 ...
- [提升性选讲] 树形DP进阶:一类非线性的树形DP问题(例题 BZOJ4403 BZOJ3167)
转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7337179.html 树形DP是一种在树上进行的DP相对比较难的DP题型.由于状态的定义多种多样,因此解法也五 ...
随机推荐
- windbg-windows调试工具来抓端游crash dump
windbg下载有两种方式: Install WinDbg - Windows drivers | Microsoft Learn 从微软应用商店下载 dump上的windows的局部变量解析部分进行 ...
- 9.3 Windows驱动开发:内核解析PE结构节表
在笔者上一篇文章<内核解析PE结构导出表>介绍了如何解析内存导出表结构,本章将继续延申实现解析PE结构的PE头,PE节表等数据,总体而言内核中解析PE结构与应用层没什么不同,在上一篇文章中 ...
- MySQL 之单表查询(精简笔记)
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RD ...
- yarn常用命令
1. 安装 npm install yarn -g 2. 设置淘宝镜像 yarn config set npmRegistryServer https://registry.npm.taobao.or ...
- SpringBoot接入阿里云oss
1.pom中添加阿里云oss坐标 <?xml version="1.0" encoding="utf-8"?> <dependencies&g ...
- Redis安装,数据类型及常用命令
安装 - 可以使用yum 安装,要先配置epel源 ``` yum install -y redis ``` - 可以编译安装 ``` wget http://download.redis.io/re ...
- 如何在 macOS Sonoma 虚拟机中安装 VMware Tools
vmware-tools VMware Tools 简介 VMware Tools 中包含一系列服务和模块,可在 VMware 产品中实现多种功能,从而使用户能够更好地管理客户机操作系统,以及与客户机 ...
- 【算法】【回溯】两道经典排列问题OJ详解【力扣46 力扣47】【超详细的回溯算法教程】让我们牢牢把握回溯的精髓
[算法][回溯]两道经典排列问题OJ详解[力扣46 力扣47][超详细的回溯算法教程]让我们牢牢把握回溯的精髓 作者: @小小Programmer 这是我的主页:@小小Programmer 在食用这篇 ...
- 零基础入门学习Java课堂笔记 ——day01
Java语法 1.注释.标识符.关键字 注释 不会被程序执行的代码或者块 //双斜杠表示单行注释 /*表示多行注释*/ 标识符.关键字 关键词系统事先定义好的,我们能直接拿来用的,不能作为变量名使用 ...
- [Ngbatis源码学习][Spring] Spring 的资源管理 ResourceLoader
在学习Ngbatis的源码时,看到了有关xml文件的加载,涉及到了资源的加载,对相关知识进行总结与整理. 1. 相关类 Resource AbstractResource ResourceLoader ...