dengxinyi 6 gadi atpakaļ
vecāks
revīzija
6d14da84f1
1 mainītis faili ar 60 papildinājumiem un 0 dzēšanām
  1. 60 0
      medium/654.maximum-binary-tree.go

+ 60 - 0
medium/654.maximum-binary-tree.go

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