树形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题型.由于状态的定义多种多样,因此解法也五 ...
随机推荐
- Leetcode 92题反转链表 II(Reverse Linked List II) Java语言求解
前言 反转链表可以先看我这篇文章: Leetcode 206题 反转链表(Reverse Linked List)Java语言求解 题目链接 https://leetcode-cn.com/probl ...
- 使用Git 命令行拉取、提交、推送、合并 代码
1.拉取 1.1.拉取该分支的最新代码(远程分支是与当前分支相同) git pull origin updateCode 1.2.拉取最新代码(远程分支是与当前分支不相同,但要合并) git pull ...
- 从零开始匹配vim(0)——vimscript 简介
通过之前一系列的文章,相信各位小伙伴应该已经对vim产生了浓厚的兴趣,可能不少小伙伴通过慢慢的使用变的跟我一样,离开vim就不会写代码了.如果你希望继续长时间使用vim,甚至将vim作为主要的代码编辑 ...
- gRPC学习小札
gRPC 前言 为什么使用gRPC 传输协议 传输效率 性能消耗 gRPC入门 gRPC流 证书认证 使用根证书 gRPC实现token认证 和Web服务共存 验证器 REST接口 grpcurl工具 ...
- 因为命名被diss无数次。简单聊聊编程最头疼的事情之一:命名
本文已经收录进我的 80K+ Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指南」一份涵盖 ...
- 为Win12做准备?微软Win11 23H2将集成AI助手:GPT4免费用
微软日前确认今年4季度推出Win11 23H2,这是Win11第二个年度更新. Win11 23H2具体有哪些功能升级,现在还不好说,但它会集成微软的Copilot,它很容易让人想到多年前的" ...
- 深入浅出Java多线程(六):Java内存模型
引言 大家好,我是你们的老伙计秀才!今天带来的是[深入浅出Java多线程]系列的第六篇内容:Java内存模型.大家觉得有用请点赞,喜欢请关注!秀才在此谢过大家了!!! 在并发编程中,有两个关键问题至关 ...
- 蓝鲸单机离线部署:app_mgr组件安装失败解决
之前在腾讯蓝鲸智云-单机离线部署测试中,遇到了几个安装问题,本文记录下3.2 app_mgr组件安装失败 的解决过程,因为这个问题卡了很久(可能也是因为笔者对python相关知识和蓝鲸产品不够熟悉), ...
- JOISC 2022 记录
Day1 T1 Jail 操作很类似华容道.由于这题是可以树,同时每一个人走的都是最短路,这也就意味着不会出现通过好多个人一起的挪动来匀出空间. 所以如果合法,必然存在一种方案是每一次直接将一个人挪到 ...
- MongoDB Security
1. Security MongoDB提供了一系列的保护措施,以保护它自身安全: 启用访问控制并实行身份验证 MongoDB支持多种身份认证机制,默认的认证机制是SCRAM 配置基于角色的访问控制 ...