【题目】
  定义二叉树节点如下:

class Node{public int value;public Node left;public Node right;public Node(int data){this.value = data;}
}

一个数组的MaxTree定义如下:

· 数组必须没有重复元素

· MaxTree是一颗二叉树,数组的每一个值对应一个二叉树节点

· 包括MaxTree树在内且在其中的每一颗子树上,值最大的节点都是树的头

给定一个没有重复元素的数组arr,写出生成这个数组的MaxTree的函数,要求如果数组的长度为N,则时间复杂度为O(N),额外空间复杂度为O(N)

【解答】

  以下列原则来建立这棵树:
  · 每一个数的父节点是它左边第一个比它大的数和它右边第一个比它大的数中,较小的那个
  ·如果一个数左边没有比它大的数,右边也没有。也就是说,这个数是整个数组的最大值,那么这个数是MaxTree的头结点

  知道了原则,那么如何可能快的找到每一个数左右两边第一个比它大的数呢?利用栈。
  找每个数左边第一个比它大的数,从左到右遍历每个数,栈中保持递减序列,新来的数不停地利用Pop出栈顶,直到栈顶比新数大或者没有数。
  以[3,1,2]为例,首先3入栈,接下来1比3小,直接入栈,并且确定了1左边第一个比它大的数是3;接下来2比1大,1出栈,同时可以确定1右边第一个比它大的数是2;接下来2比3小,2入栈,并且确定了2左边第一个比它大的数是3。此时栈中的元素为[3,2],没有数使它们出栈,所以3和2右边都没有比它大的数。

public Node getMaxTree(int[] arr){Node[] nArr = new Node[arr.length];for(int i=0;i!=arr.length;i++){nArr[i] = new Node(arr[i]);}Stack<Node> stack = new Stack<Node>();HashMap<Node,Node> lBigMap = new HashMap<Node,Node>();HashMap<Node,Node> rBigMap = new HashMap<Node,Node>();for(int i=0;i!=arr.length;i++){Node curNode = nArr[i];while((!stack.isEmpty()) && stack.peek().value < curNode.value){Node popNode = stack.pop();if(stack.isEmpty()){lBigMap.put(popNode,null);rBigMap.put(popNode,curNode);}else{lBigMap.put(popNode,stack.peek());rBigMap.put(popNode,curNode);}}stack.push(curNode);}while(!stack.isEmpty()){Node popNode = stack.pop();if(stack.isEmpty()){lBigMap.put(popNode,null);rBigMap.put(popNode,null);}else{lBigMap.put(popNode,stack.peek());rBigMap.put(popNode,null);}}Node head = null;for(int i=0;i!=nArr.length;i++){Node curNode = nArr[i];Node left = lBigMap.get(curNode);Node right = rBigMap.get(curNode);if(left==null && right == null){head = curNode;}else if(left==null){if(right.left==null){right.left = curNode;}else{right.right = curNode;}}else if(right==null){if(left.left==null){left.left = curNode;}else{left.right = curNode;}}else{Node parent = left.value < right.value ? left : right;if(parent.left == null){parent.left = curNode;}else{parent.right = curNode;}}}return head;
}

栈和队列——构造数组的MaxTree(java实现)相关推荐

  1. Java笔记整理五(Iterator接口,泛型,常见数据结构(栈,队列,数组,链表,红黑树,集合),jdk新特性,异常,多线程,Lambda表达式)

    Java笔记整理五 1.1Iterator接口 Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象 ...

  2. JAVA day16、17 数据结构(栈、队列、数组、链表、红黑树)

    一.什么叫数据结构? 数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带"结构"的数据元素的集合."结构"就是指数据元素之间存在的关系,分为逻辑结构 ...

  3. 栈、队列和数组(包括求解迷宫问题)

    1.1 琐碎知识点 栈.队列.数组是线性存储结构,它们都是一段连续的内存空间,其中栈和队列是动态的,而数组是静态的.它们的区别在于: 栈:后进先出,只能在栈顶进行插入和删除操作. 队列:先进先出,只能 ...

  4. 数据结构与算法第二章 线性表、栈、队列、数组、字符串、树、二叉树、哈希表的增删查

    03 增删查:掌握数据处理的基本操作,以不变应万变 通过前面课时的学习,相信你已经建立了利用数据结构去完成时空转移的思想.接下来,你需要在理论思想的指导下灵活使用.其实,要想灵活使用数据结构,你需要先 ...

  5. 数据结构 思维导图【绪论、线性表、栈、队列和数组、树与二叉树、图、查找、排序】

    目录 01.绪论 02.线性表 03.栈.队列和数组 04.树与二叉树 05.图 06.查找 07.排序 算法 数据结构 排序算法 01.绪论 02.线性表 03.栈.队列和数组 04.树与二叉树 0 ...

  6. 计算机队列概念,2020计算机专业考研数据结构知识点:栈、队列和数组

    2020计算机专业考研数据结构知识点:栈.队列和数组 1.栈.队列的定义及其相关数据结构的概念,包括:顺序栈.链栈.循环队列.链队列等.栈与队列存取数据(请注意包括:存和取两部分)的特点. 2. 掌握 ...

  7. java栈和队列实现删除,数据结构学习--Java栈和队列

    栈:先进后出 队列:先进先出 都是数组存放,但是删除的时候不是删除了数组中的数据,而是使用增加游标标识的方式实现删除,"游标标识"加加或者减减完成删除操作,查看的时候,也不是直接查 ...

  8. 王道考研408 数据结构 第三章 栈、队列与数组

    第三章 栈.队列与数组 3.1 栈 3.1.03 假设以I和O分别表示入栈和出栈操作.栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则称为非法序 ...

  9. 简单的数据结构介绍(栈、队列、数组、链表、红黑树)

    学习目标: 了解常见的数据结构 学习内容: 栈.队列.数组.链表.红黑树 学习产出: 1. 数据结构 数据结构 : 就是数据用什么样的方式组合在一起 常见的数据结构有: 栈, 队列, 数组, 链表和红 ...

最新文章

  1. 《统一沟通-微软-实战》-3-部署-Exchange 2010-4-基本配置
  2. 简述DNS进行域名正向解析的过程。
  3. Linq之Lambda表达式初步认识
  4. AI应用开发基础傻瓜书系列3-损失函数
  5. SpringBoot2.1.5(16)--- Spring Boot的日志详解
  6. go语言通道插入0_使用Go语言常遇到的问题
  7. 用户界面草图设计工具-工具包和资源
  8. cent os7 安装nginx1.16.1
  9. 基于OpenVINO的端到端DL网络-初步接触OpenVINO提供的例子(win+vs)
  10. matlab 正20面体,求正十二面体和正二十面体的相邻两个表面的二面角大小
  11. php开发微信会员系统,PHP实例:微信公众号实现会员卡领取功能
  12. dede标签属性(转载)
  13. POJ2248-Addition Chains-经典搜索题详解优化
  14. 巧用 Win10 分屏功能
  15. Ubuntu下使用opencv完成图像程序编程操作
  16. 【八月英语----照亮我心】
  17. Nacos Server did not start because dumpservice bean construction failure : No DataSource set异常解决
  18. 14_JavaScript数据结构与算法(十四)图
  19. scrollHeight、clientHeight、offsetHeight、 scrollTop
  20. 市场规模到底应该如何测算?

热门文章

  1. React 官网入门教程 - 井字棋小游戏
  2. Redis报错:WRONGTYPE Operation against a key holding the wrong kind of value;解决办法
  3. RESTful API接口设计标准及规范;
  4. 奔向三张,不破不立:一个iOS开发工程师的职业规划思考(转自iOSer 逆,以资激励)
  5. java基础:网络编程(一)简介
  6. 视频教程-Android Studio 开发详解-Android
  7. python爬虫 爬取淘女郎介绍以及照片
  8. 校友会小程序开发笔记六:校友活动聚会功能模块设计与实现
  9. codevs 3061 质子撞击炮②
  10. win7修改计算机主机名称,Windows7旗舰版计算机名称无法修改解决方法