栈和队列---构造数组的MaxTree
来源:互联网 发布:云服务器软件 编辑:程序博客网 时间:2024/05/29 01:52
【题目】
定义二叉树节点如下:
class Node: def __init__(self, value): self.value = value self.left = None self.right = None
一个数组的MaxTree定义如下:
1、数组中必须没有重复元素
2、MaxTree是一棵二叉树,数组的每一个值对应一个二叉树的节点
3、包括MaxTree树在内且在其中的每一棵子树上,值最大的节点就是树的头。
给定一个没有重复元素的数组arr,写出生成这个数组的MaxTree的函数,要求如果数组长度为N,则时间复杂度为O(N)、额外空间复杂度为O(N)。
【基本思路】
使用以下原则建立这棵树:
1、每一个数的父节点是它左边第一个比它大的数和它右边第一个比它大的数中,较小的一个。
2、如果一个数左边没有比它大的数,右边也没有,那么这个数就是整个数组中的最大值,那么这个数是MaxTree的头节点。
接下来的只要知道每一个数左边比它大的数以及右边比它大的数,剩下的工作就很好实现了。如何实现呢?使用栈。
从左到右遍历数组arr,假设遍历到的位置为i,如果栈为空或者栈顶元素大于arr[i],直接将arr[i]压入栈中;否则将栈中小于arr[i]的元素全部出栈,然后压入arr[i]。同时,栈中元素的左边第一个比它大的数就是它相邻的数,右边第一个比它大的数就是使它出栈的数,如果没有数使它出栈,说明它右边没有比它大的数。
以[3,1,2]为例,首先3入栈,接下来1比3小,直接入栈,并且确定了1左边第一个比它大的数是3;接下来2比1大,1出栈,同时可以确定1右边第一个比它大的数是2;接下来2比3小,2入栈,并且确定了2左边第一个比它大的数是3。此时栈中的元素为[3,2],没有数使它们出栈,所以3和2右边都没有比它大的数。
【代码实现】
#python3.5class Node: def __init__(self, value): self.value = value self.left = None self.right = Nonedef getMaxTree(arr): nArr = [Node(arr[i]) for i in range(len(arr))] lBigMap = {} rBigMap = {} stack = [] for i in range(len(nArr)): curNode = nArr[i] while stack and stack[-1].value < curNode.value: cur = stack.pop() lBigMap[cur] = stack[-1] if stack else None rBigMap[cur] = curNode stack.append(curNode) while stack: cur = stack.pop() lBigMap[cur] = stack[-1] if stack else None rBigMap[cur] = None head = None for i in range(len(nArr)): curNode = nArr[i] left = lBigMap[curNode] right = rBigMap[curNode] if left == None and right == None: head = curNode elif left == None: if right.left == None: right.left = curNode else: right.right = curNode elif right == None: if left.left == None: left.left = curNode else: left.right = curNode else: parent = left if left.value < right.value else right if parent.left == None: parent.left = curNode else: parent.right = curNode return head
- 栈和队列---构造数组的MaxTree
- 栈和队列 构造数组的MaxTree
- 栈和队列——构造数组的MaxTree(java实现)
- 构造数组的MaxTree
- 构造数组的MaxTree
- 构造数组的MaxTree
- 构造数组的MaxTree
- 【算法】构造数组的MaxTree
- 构造数组的MaxTree----详细的题解
- 【难】【二叉树】构造数组的MaxTree
- 数据结构(8) 构造数组的MaxTree
- 1_8构造数组的maxtree
- 构造数组的MaxTree(二叉树)
- 构造数组MaxTree、环形单链表的约瑟夫问题等总结
- 构造数组的MaxTree(每日一道算法题)
- 构造MaxTree
- 构造MaxTree
- 构造MaxTree
- MyBatis之使用resultMap实现高级映射
- centos7安装git
- Tomcat源码分析--MessageBytes类
- springmvc学习笔记(1)-框架原理和入门配置
- 判断是否是凸多边形,判断点是否在多边形内,点到直线的距离
- 栈和队列---构造数组的MaxTree
- 线索化二叉树(一)
- 超详细的数据分析职业规划
- element 的时间控件,有关v-model,:picker-options,@change
- Android Studio中编码问题(出现中文乱码)
- Qt图片转灰度
- 移动端向上滑动获取下一页数据
- 基于zookeeper实现分布式锁
- 跟我一起写Makefile