单调栈介绍以及构造数组的MaxTree问题
- 单调栈介绍
- 单调栈解决构造数组的MaxTree问题
- 堆解决构造数组的MaxTree问题
- 完整测试代码
题目(构造数组的MaxTree问题)
单调栈介绍
单调栈最初解决的问题就是寻找一个数组中 ,每一个数的左右两边离它最近的数。
- 遍历一个数组,如果栈为空或者栈顶比当前数大(或者相等,相等的话就多个下标对应一个值),就把当前数入栈;
- 如果栈顶比当前数小,那么就处理这个栈顶,即这个栈顶右边第一个比它大的数就是当前数,左边第一个比它大的数就是在栈里面它的下面的那个数,也就是它出栈之后的栈顶;
- 当遍历完所有的数之后,栈中还有数,这时,逐个判断栈中的数,每一个数,它的右边不存在比它大的,如果这个数在栈里面它的下面还有数,它左边离他最近的大的数就是它下面的数;
单调栈解决构造数组的MaxTree问题
按照下面的方法来建树
- 每一个树的父节点是它左边第一个比它大的数和它右边第一个比它大的数中,比较小的那个;
- 如果左边没有没有比它大的数,右边也没有。也就是说,这个数是整个数组的最大值,那么这个数是
MaxTree
的头结点;
按照大根堆和上面的方案放置如下:
相关证明:
1 | //返回构造的树的头结点 |
堆解决构造数组的MaxTree问题
由于从上到下减小,所以正好是一个堆,可以使用堆来写:
1 | static Node getMaxTree2(int[] arr) { |
完整测试代码
1 | import java.util.HashMap; |
效果
这里没有用二叉树遍历来验证,直接用的直观打印二叉树的方法,上面打印二叉树的程序可以看这篇博客。