|
@@ -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
|
|
|
+}
|