123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- /**
- * 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
- }
|