package com.my.util;
public class Node {
public int value;
public Node left;
public Node right;
public Node(int value) {
this.value = value;
}
}
package com.my.suanfa;
import java.util.HashMap;
import java.util.Stack;
import com.my.util.Node;
public class Solution04 {
public Node getMaxTree(int[] arr) {
Node[] nArr = new Node[arr.length];
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) {
popStackSetMap(stack, lBigMap);
}
stack.push(curNode);
}
while(!stack.isEmpty()) {
popStackSetMap(stack,lBigMap);
}
for(int i = nArr.length - 1; i >= 0; i--) {
Node curNode = nArr[i];
while(!stack.isEmpty() && stack.peek().value < curNode.value) {
popStackSetMap(stack, rBigMap);
}
stack.push(curNode);
}
while(!stack.isEmpty()) {
popStackSetMap(stack, rBigMap);
}
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;
}
public void popStackSetMap(Stack<Node> stack, HashMap<Node, Node> map) {
Node curNode = stack.pop();
if(stack.isEmpty()) {
map.put(curNode, null);
}else {
map.put(curNode, stack.peek());
}
}
}