博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
构造MaxTree
阅读量:4091 次
发布时间:2019-05-25

本文共 1560 字,大约阅读时间需要 5 分钟。

题目描述

对于一个没有重复元素的整数数组,请用其中元素构造一棵MaxTree,MaxTree定义为一棵二叉树,其中的节点与数组元素一一对应,同时对于MaxTree的每棵子树,它的根的元素值为子树的最大值。现有一建树方法,对于数组中的每个元素,其在树中的父亲为数组中它左边比它大的第一个数和右边比它大的第一个http://write.blog.csdn.net/postedit?ref=toolbar&ticket=ST-3460-nsEg1YRiH0DI6jAbV4uJ-passport.csdn.net数中更小的一个。若两边都不存在比它大的数,那么它就是树根。请证明这个方法的正确性,同时设计O(n)的算法实现这个方法。

给定一个无重复元素的数组A和它的大小n,请返回一个数组,其中每个元素为原数组中对应位置元素在树中的父亲节点的编号,若为根则值为-1。

测试样例:
[3,1,4,2],4
返回:[2,0,-1,2]
思路:首先找到最大的元素,作为树根。这里构造了一个方法findTheMax来查找A数组任意指定区间内的最大值,返回其下标。然后采用分治策略分别对树根左右区间进行处理。要留意如果区间是一个开区间,即最左边是下标0或最右边是下标n-1,这时需要设置一个哨兵位来保证一个开区间内的最大值(也就是这个区间形成的子树的根)能正常找到它的父节点(即区间两端较小的那个值)。这个过程也就是填充result数组的过程,用fillTheSubtree方法操作实现。
import java.util.*;public class MaxTree {    public static int findTheMax(int st,int ed,int[] raw){		int mj = -1;		int max = -1;		for(int i=st;i<=ed;i++){			if(raw[i]>max){				max = raw[i];				mj = i;			}		}		return mj;	}	public static void fillTheSubtree(int st,int ed,int[] raw,int[] result){		if(st>ed)			return;		int le = st-1;		int lev = 100000000;		int ri = ed+1;		int riv = 100000000;		if(le>=0){			lev = raw[le];		}		if(ri<=raw.length-1){			riv = raw[ri];		}		int dopo = findTheMax(st,ed,raw);		int less = lev>riv?ri:le;		result[dopo] = less;				fillTheSubtree(st,dopo-1,raw,result);		fillTheSubtree(dopo+1,ed,raw,result);			}    public int[] buildMaxTree(int[] A, int n) {        // write code here    	int[] result = new int[n];    	Arrays.fill(result, 0);    	int m = findTheMax(0,n-1,A);    	result[m] = -1;    	fillTheSubtree(0,m-1,A,result);    	fillTheSubtree(m+1,n-1,A,result);    	    	return result;    }}
你可能感兴趣的文章
QT打开项目提示no valid settings file could be found
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
Java8 HashMap集合解析
查看>>
自定义 select 下拉框 多选插件
查看>>
fastcgi_param 详解
查看>>
搞定Java面试中的数据结构问题
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>
Winform多线程
查看>>
Spring AOP + Redis + 注解实现redis 分布式锁
查看>>
poj 1976 A Mini Locomotive (dp 二维01背包)
查看>>
《计算机网络》第五章 运输层 ——TCP和UDP 可靠传输原理 TCP流量控制 拥塞控制 连接管理
查看>>
《PostgreSQL技术内幕:查询优化深度探索》养成记
查看>>
剑指_复杂链表的复制
查看>>
FTP 常见问题
查看>>
shell 快捷键
查看>>
MODULE_DEVICE_TABLE的理解
查看>>
No devices detected. Fatal server error: no screens found
查看>>