我们知道dp也就是动态规划的思想就是先解决小问题,通过不断的解决小问题,最终解决大问题。那么能够应用树形dp套路的题目都应该符合一个条件,那就是通过解决每个子树的小问题,最终解决整棵树的大问题。

套路

  1. 分析有几种可能
  2. 需要哪些信息
  3. 汇总信息,构造ReturnType
  4. 构造递归函数

找到二叉树中的最大搜索二叉子树

首先,这道题是可以通过先解决小的子树最大搜索二叉子树,然后不断扩大范围,最终解决整棵树的最大搜索二叉子树。

那么分析套路开始:

  1. 分析有哪些情况?

    第一:最大搜索二叉子树在左子树中

    第二:最大搜索二叉子树在右子树中

    第三:整颗左子树+头结点+整颗右子树,是一个搜索二叉树

  2. 需要哪些信息?

    maxBSTHead最大搜索二叉子树的头结点,我们需要返回他

    maxBSTSize最大搜索二叉子树的大小,我们需要跟其他搜索二叉树比较

    左子树的最大值,我们需要这个值跟头结点比较

    右子树的最小值,我们需要这个值跟头结点比较

  3. 合并信息到ReturnType

  4. 构造递归函数

    首先返回值是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. 有哪些情况?

    就那一种情况,那就是左树,右树都是平衡二叉树,并且高度差小于等于1

  2. 需要哪些信息?

    高度,该树是否为平衡

  3. 综合信息到ReturnType

  4. 构造递归函数

    返回值,参数,终止条件不多说了。同样的格式,先是左右递归,然后操作之。我们需要求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。当然如果左子树更长一些就好了。

当然还有右子树长一点的。

  1. 有几种情况?

    第一种树比较平衡,那么在左子树,右子树各取一点,那么可能是最大距离

    第二种,左子树比较长,右子树比较短,那么从左子树中去两点,可能是最大距离

    第三种,右子树长,左子树短,则从右子树取两点

  2. 需要哪些信息?

    树高,用来计算两点的距离

    最长距离,需要进行比较

  3. 放到ReturnType

  4. 构造递归函数

    只说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套路的更多相关文章

  1. 虚树(树形dp套路)模板——bzoj2286

    虚树的核心就是把关键点和关键点的lca重新生成一棵树,然后在这棵树上进行dp https://www.cnblogs.com/zwfymqz/p/9175152.html  写的很好的博客 建立虚树的 ...

  2. CCPC-Wannafly Winter Camp Day1 流流流动 (树形dp)

    题目描述 喜欢数学的wlswls最近被萎住了. 现在他一共有1...n1...n这么多数字,取数字ii会得到f[i]f[i]的收益.数字之间有些边,对于所有的i(i != 1)i(i!=1),若ii为 ...

  3. 树形dp系列

    1.火车站开饭店 最大独立集裸题 #include<iostream> #include<cstdio> #include<cstdlib> #include< ...

  4. 树形dp总结

    转自 http://blog.csdn.net/angon823 介绍 1.什么是树型动态规划 顾名思义,树型动态规划就是在"树"的数据结构上的动态规划,平时作的动态规划都是线性的 ...

  5. 『战略游戏 最大利润 树形DP』

    通过两道简单的例题,我们来重新认识树形DP. 战略游戏(luoguP1026) Description Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题.他要 ...

  6. 树形DP和状压DP和背包DP

    树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...

  7. GDOI2018 滑稽子图 [斯特林数,树形DP]

    传送门并没有 思路 见到那么小的\(k\)次方,又一次想到斯特林数. \[ ans=\sum_{T} f(T)^k = \sum_{i=0}^k i!S(k,i)\sum_{T} {f(T)\choo ...

  8. BZOJ.2159.Crash的文明世界(斯特林数 树形DP)

    BZOJ 洛谷 挺套路但并不难的一道题 \(Description\) 给定一棵\(n\)个点的树和\(K\),边权为\(1\).对于每个点\(x\),求\(S(x)=\sum_{i=1}^ndis( ...

  9. 算法进阶面试题05——树形dp解决步骤、返回最大搜索二叉子树的大小、二叉树最远两节点的距离、晚会最大活跃度、手撕缓存结构LRU

    接着第四课的内容,加入部分第五课的内容,主要介绍树形dp和LRU 第一题: 给定一棵二叉树的头节点head,请返回最大搜索二叉子树的大小 二叉树的套路 统一处理逻辑:假设以每个节点为头的这棵树,他的最 ...

  10. [提升性选讲] 树形DP进阶:一类非线性的树形DP问题(例题 BZOJ4403 BZOJ3167)

    转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7337179.html 树形DP是一种在树上进行的DP相对比较难的DP题型.由于状态的定义多种多样,因此解法也五 ...

随机推荐

  1. 深度学习基础入门篇[六(1)]:模型调优:注意力机制[多头注意力、自注意力],正则化【L1、L2,Dropout,Drop Connect】等

    深度学习基础入门篇[六(1)]:模型调优:注意力机制[多头注意力.自注意力],正则化[L1.L2,Dropout,Drop Connect]等 1.注意力机制 在深度学习领域,模型往往需要接收和处理大 ...

  2. 驱动开发:通过SystemBuf与内核层通信

    内核层与应用层之间的数据交互是必不可少的部分,只有内核中的参数可以传递给用户数据才有意义,一般驱动多数情况下会使用SystemBuf缓冲区进行通信,也可以直接使用网络套接字实现通信,如下将简单介绍通过 ...

  3. Python PyWin32 模块

    Python的生产效率极高,通过使用pypiwin32模块可以快速调用windows API函数,结合Python的高效开发能力,同等时间内比C++能更快的达到目标,pypiwin32模块封装了Win ...

  4. 201871010111-刘佳华 实验二 个人项目—《D[01]背包问题》项目报告

    实验二 软件工程个人项目 ========== 时间:2021-3-18 项目 内容 课程班级博客链接 课程链接 这个作业要求链接 作业要求 我的课程学习目标 1.了解软件工程过程中个人项目的开发流程 ...

  5. 阿里二面:SpringBoot可以同时处理多少个请求?当场懵了。。。。

    SpringBoot以其简洁高效的开发方式和强大的内嵌容器特性,为开发者提供了构建高性能后端服务的便利.然而,当面临高并发场景时,理解并合理配置Spring Boot应用以达到最佳的并发处理能力至关重 ...

  6. Linux使用wget命令下载网络资源

    之前接触的Linux环境大多是内网,一般都是采用传统的FTP服务器统一存放常用资源,有人需要时从FTP直接下载,若公司FTP没有想要的资源,还需联系管理维护人员下载上传对应的介质. 而目前随着云ECS ...

  7. NC200324 魔改森林

    题目链接 题目 题目描述 曾经有一道叫做迷雾森林的题目,然而牛牛认为地图中的障碍太多,实在是太难了,所以删去了很多点,出了这道题. 牛牛给出了一个n行m列的网格图 初始牛牛处在最左下角的格点上(n+1 ...

  8. NC23619 小A的柱状图

    题目 题目描述 柱状图是有一些宽度相等的矩形下端对齐以后横向排列的图形,但是小A的柱状图却不是一个规范的柱状图,它的每个矩形下端的宽度可以是不相同的一些整数,分别为 \(a[i]\) ,每个矩形的高度 ...

  9. Vue实现简单图书管理例子

    以下内容整理自网络. 说明 本例主要涵盖以下知识点: 数据绑定 条件与循环 计算属性 监听器 过滤器 常见数组和对象操作 vue生命周期 示例演示 代码 <!DOCTYPE html> & ...

  10. 从零开始学Spring Boot系列-前言

    从零开始学Spring Boot系列-前言 在数字化和信息化的时代,Java作为一种成熟.稳定且广泛应用的编程语言,已经成为构建企业级应用的首选.而在Java生态系统中,Spring框架无疑是其中最为 ...