构造数组的MaxTree(每日一道算法题)
2017-11-20 11:53
453 查看
题目:给一个数组(无重复的数字),构造一个二叉树,数组的每一个值对应一个二叉树节点。头结点是最大值。
package Tree; import java.util.HashMap; import java.util.Stack; /** * @author:MindMrWang *2017年11月20日 *:function:构造数组的MaxTree */ public class MaxTree { public static void main(String[] args) { int[]arr = {3,4,5,1,2}; Node head = getMaxTree(arr); System.out.println(head.value); System.out.println(head.left.value); System.out.println(head.right.value); System.out.println(head.left.left.value); System.out.println(head.right.left.value); } public static 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!=nArr.length;i++) { Node curNode = nArr[i]; while(!stack.isEmpty()&&stack.peek().value<curNode.value) {//如果stack不为空,且当前节点大于栈顶节点的值 popStackSetMap(stack,lBigMap);//那么调用方法将栈顶的值设置为它的左边第一个最大值 } stack.push(curNode);//每次都将节点数组向stack中push } while(!stack.isEmpty()) { popStackSetMap(stack,lBigMap); } for(int i = nArr.length-1;i!=-1;i--) { Node curNode = nArr[i]; while(!stack.isEmpty()&&stack.peek().value<curNode.value) {//如果stack不为空,且当前节点x小于栈顶节点的值 popStackSetMap(stack,rBigMap);//那么调用方法将栈顶的值设置为它的右边第一个最大值 } stack.push(curNode);//每次都将节点数组向stack中push } while(!stack.isEmpty()) { popStackSetMap(stack,rBigMap); } Node head = null; for(int i = 0;i!=nArr.length;i++) {//根据上面的map,将这些节点进行关系关联成为一棵树 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; } public static void popStackSetMap(Stack<Node> stack,HashMap<Node,Node> map) { Node popNode = stack.pop(); if(stack.isEmpty()) { map.put(popNode, null); }else { map.put(popNode, stack.peek()); } } } //节点类 class Node { public int value; public Node left; public Node right; public Node(int data) { this.value=data; } }
相关文章推荐
- 每日一道算法题:数组中出现次数超过一半的数字
- 每日一道算法题3——得到数组子数组最大和
- 每日一道算法题:微软面试题:在排序数组中,找出给定数字出现的次数
- 每日一道算法题:两个数组的交集
- 每日一道算法题:打印一维数组的所有组合
- 每日一道算法题:一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
- 每日一道算法题:输出和为n的连续正整数序列
- LintCode2016年8月22日算法比赛----将数组重新排序以构造最小值
- 每日一道算法题:输入一个表示整数的字符串,把该字符串转换成整数并输出
- 每日一个小算法(一) 数组中连续个数组成的和最大
- 每天一道算法题目,求数组中的最大值和最小值
- 每天一道算法题(32)——输出数组中第k小的数
- 每日一算法:求连续子数组和的最大值
- 每日一道算法题:Google 2009年某笔试题:求出元素位于0到9之间的集合A中大于某个给定正整数K的组成的最小正整数。
- 每天一道算法题8 在排序数组中查找和为给定值的两个数字
- 一道算法题:找出数组中出现次数超过一半的数
- 构造数组的MaxTree
- 【每日一道算法题】
- 每日一道算法题——矩形覆盖
- 每日一道算法题——最长回文字串