您的位置:首页 > 其它

构造数组的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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: