|  | @@ -0,0 +1,60 @@
 | 
	
		
			
				|  |  | +/**
 | 
	
		
			
				|  |  | + * Definition for a binary tree node.
 | 
	
		
			
				|  |  | + * type TreeNode struct {
 | 
	
		
			
				|  |  | + *     Val int
 | 
	
		
			
				|  |  | + *     Left *TreeNode
 | 
	
		
			
				|  |  | + *     Right *TreeNode
 | 
	
		
			
				|  |  | + * }
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +type maxHeap []int
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (h maxHeap) Len() int           { return len(h) }
 | 
	
		
			
				|  |  | +func (h maxHeap) Less(i, j int) bool { return h[j] < h[i] }
 | 
	
		
			
				|  |  | +func (h maxHeap) Swap(i, j int)      { h[i], h[j] = h[j], h[i] }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (h *maxHeap) Push(x interface{}) {
 | 
	
		
			
				|  |  | +	*h = append(*h, x.(int))
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (h *maxHeap) Pop() interface{} {
 | 
	
		
			
				|  |  | +	l := h.Len()
 | 
	
		
			
				|  |  | +	x := (*h)[l-1]
 | 
	
		
			
				|  |  | +	*h = (*h)[:l-1]
 | 
	
		
			
				|  |  | +	return x
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func constructMaximumBinaryTree(nums []int) *TreeNode {
 | 
	
		
			
				|  |  | +	if len(nums) == 0 {
 | 
	
		
			
				|  |  | +		return (*TreeNode)(nil)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	m := make(map[int]int)
 | 
	
		
			
				|  |  | +	var h maxHeap
 | 
	
		
			
				|  |  | +	for i, v := range nums {
 | 
	
		
			
				|  |  | +		m[v] = i
 | 
	
		
			
				|  |  | +		heap.Push(&h, v)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	root := TreeNode{heap.Pop(&h).(int), nil, nil}
 | 
	
		
			
				|  |  | +	for h.Len() != 0 {
 | 
	
		
			
				|  |  | +		curr := &root
 | 
	
		
			
				|  |  | +		v := heap.Pop(&h).(int)
 | 
	
		
			
				|  |  | +		i := m[v]
 | 
	
		
			
				|  |  | +		for {
 | 
	
		
			
				|  |  | +			j := m[curr.Val]
 | 
	
		
			
				|  |  | +			if i < j {
 | 
	
		
			
				|  |  | +				if curr.Left == nil {
 | 
	
		
			
				|  |  | +					curr.Left = &TreeNode{v, nil, nil}
 | 
	
		
			
				|  |  | +					break
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				curr = curr.Left
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				if curr.Right == nil {
 | 
	
		
			
				|  |  | +					curr.Right = &TreeNode{v, nil, nil}
 | 
	
		
			
				|  |  | +					break
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +				curr = curr.Right
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return &root
 | 
	
		
			
				|  |  | +}
 |