|
@@ -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()
|
|
|
}
|