dengxinyi преди 6 години
родител
ревизия
332ff64825
променени са 1 файла, в които са добавени 56 реда и са изтрити 10 реда
  1. 56 10
      hard/helper.go

+ 56 - 10
hard/helper.go

@@ -4,6 +4,15 @@ import (
 	"strconv"
 )
 
+// Integer ...
+type Integer *int
+
+func newInt(n int) Integer {
+	i := new(int)
+	*i = n
+	return i
+}
+
 // ListNode ...
 type ListNode struct {
 	Val  int
@@ -77,6 +86,51 @@ func printList(head *ListNode) {
 	println()
 }
 
+func toBST(nums []int) *TreeNode {
+	if len(nums) == 0 {
+		return nil
+	}
+	mid := len(nums) / 2
+	root := TreeNode{nums[mid], nil, nil}
+	// only one element in nums, return TreeNode{ele, nil, nil}
+	if mid == 0 {
+		return &root
+	}
+	root.Left = toBST(nums[:mid])
+	root.Right = toBST(nums[mid+1:])
+	return &root
+}
+
+func toBinaryTree(nums ...Integer) *TreeNode {
+	if nums[0] == nil {
+		return nil
+	}
+	root := &TreeNode{*nums[0], nil, nil}
+	upperLevel := []*TreeNode{root}
+	thisLevel := []*TreeNode{}
+	var curr *TreeNode
+	for i := 1; i < len(nums); i++ {
+		if i%2 == 1 { // Left child
+			curr = upperLevel[0]
+			upperLevel = upperLevel[1:]
+			if nums[i] != nil {
+				curr.Left = &TreeNode{*nums[i], nil, nil}
+				thisLevel = append(thisLevel, curr.Left)
+			}
+		} else { // Right child
+			if nums[i] != nil {
+				curr.Right = &TreeNode{*nums[i], nil, nil}
+				thisLevel = append(thisLevel, curr.Right)
+			}
+			if len(upperLevel) == 0 {
+				upperLevel = thisLevel
+				thisLevel = []*TreeNode{}
+			}
+		}
+	}
+	return root
+}
+
 func printTree(root *TreeNode) { // Level order traversal
 	if root == nil {
 		println("nil")
@@ -92,16 +146,8 @@ func printTree(root *TreeNode) { // Level order traversal
 			continue
 		}
 		print(curr.Val, " ")
-		if curr.Left != nil {
-			queue = append(queue, curr.Left)
-		} else if curr.Right != nil {
-			queue = append(queue, nil)
-		}
-		if curr.Right != nil {
-			queue = append(queue, curr.Right)
-		} else if curr.Left != nil {
-			queue = append(queue, nil)
-		}
+		queue = append(queue, curr.Left)
+		queue = append(queue, curr.Right)
 	}
 	println()
 }