读书笔记——最大生成树

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());
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值