package Charpter1;
/*
最大生成树:给定一个没有相同大小元素的数组 生成一个最大生成树
求解:[3,2,4,5,1] 左边第一个比当前元素大的left或者右边第一个比当前元素大的right是当前元素的父辈
* */
import java.util.HashMap;
import java.util.Stack;
class Node{
public int value;
public Node left;
public Node right;
public Node(int data){
this.value = data;
}
}
public class getMaxtree {
public static void main(String[]args){
int [] arr ={3,2,5,6,82,3};
Node arrget =getMaxTree(arr);
System.out.println(arrget);
}
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<>();
HashMap<Node,Node> lBigMap = new HashMap<>();
HashMap<Node,Node> rBigMap = new HashMap<>();
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!=-1;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 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());
}
}
}
读书笔记——最大生成树
最新推荐文章于 2020-02-11 21:55:43 发布