热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

建立数组的MaxTree+栈+HashMap+二叉树的建立

题目:一个数组的MaxTree定义如下:数组必须没有重复元素;MaxTree是一个二叉树,数组的每一个值对应一个二叉树节点;包括MaxTree树在内且在其中的每一颗子树上

题目:

一个数组的MaxTree定义如下:

数组必须没有重复元素;

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

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

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

分析: 利用下列原则可以建立题目要求的树:

1每一个数的父节点是它左边第一个比它大的数和它右边第一个比它大的数中,较小的那个。
2如果一个数左边没有比它大的数,右边也没有,也就是说,这个数是整个数组的最大值,那个这个是树根节点。

证明省略。


如何快速地找到每一个数左右两边第一个比它大的树呢?

用栈,找每个数左边第一个比它大的数时,从左到右遍历每个数,栈中保持从上到下递增序列,新来的数不停的利用pop弹出栈顶,直到栈顶比新数大或没有数。 该方法,每个数进栈一次,出栈一次,时间复杂度为O(N)。


代码如下:

import java.util.*;
public class Main {
	public static void main(String[]args){
		Main test = new Main() ; 
		int []arr = {3 , 4 , 5 , 1 , 2} ;
		Node head = test.getMaxTree(arr) ;	 
		test.preOrder(head); //按照前序遍历二叉树
    }
	public Node getMaxTree(int[] arr){
		Node [] nArr = new Node[arr.length] ; //声明
		for(int i = 0 ; i stack = new Stack() ;
		HashMap lBigMap = new HashMap() ;
		for(int i = 0 ; i rBigMap = new HashMap() ;
		for(int i = nArr.length -1 ; i >= 0 ; i--){
			Node cur = nArr[i] ;
			while(!stack.empty() && stack.peek().value  stack, HashMap map) {
		// TODO Auto-generated method stub
		Node popNode = stack.pop() ; //出栈的时候,确定好了映射关系
		if(stack.isEmpty()){
			map.put(popNode , null) ;
		}
		else{
			map.put(popNode , stack.peek()) ;
		}
	}
	
	//前序遍历二叉树
	public void preOrder(Node head){
		if(head != null){
			System.out.println(head.value);
			preOrder(head.left) ;
			preOrder(head.right) ;
		}
	}		
}
class Node{
	int value ;
	Node left ;
	Node right ;
	public Node(int value){
		this.value = value ;
		left = right = null ; //不能省略,创建树时有效
	}
}



推荐阅读
  • 我有3个来自RESEARCHS的映射值,指定要使用参考数据集填充的行中的范围。该研究 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 1Lock与ReadWriteLock1.1LockpublicinterfaceLock{voidlock();voidlockInterruptibl ... [详细]
  • 第五章:集合01
    第三章:集合01一:集合的框架结构图1.集合和数组的区别:2.Collection集合的方法:publicclassCol ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 查找给定字符串的所有不同回文子字符串原文:https://www ... [详细]
  • Opencv提供了几种分类器,例程里通过字符识别来进行说明的1、支持向量机(SVM):给定训练样本,支持向量机建立一个超平面作为决策平面,使得正例和反例之间的隔离边缘被最大化。函数原型:训练原型cv ... [详细]
author-avatar
手机用户2502941585_336
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有