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>();
Map<Node,Node> lBigMap=new HashMap<Node,Node>();
Map<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,rBigMap,curNode);
}
stack.push(curNode);
}
while(!stack.isEmpty()){
popStackSetMap(stack,lBigMap,rBigMap,null);
}
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 static void popStackSetMap(Stack<Node> stack,Map<Node,Node> lmap,Map<Node,Node> rmap,Node curNode){
Node popNode=stack.pop();
if(stack.isEmpty()){
lmap.put(popNode,null);
}else{
lmap.put(popNode, stack.peek());
}
rmap.put(popNode, curNode);
}
第4题改进版