Skip to content

Commit 5b4d11a

Browse files
committed
add solution construct-binary-search-tree-from-preorder-traversal
1 parent a8a5af7 commit 5b4d11a

4 files changed

+144
-7
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package leetcode
2+
3+
// https://leetcode.com/problems/construct-binary-search-tree-from-preorder-traversal/
4+
5+
func addBinaryTreeNode(root *TreeNode, val int) {
6+
if val < root.Val {
7+
if root.Left == nil {
8+
node := new(TreeNode)
9+
node.Val = val
10+
root.Left = node
11+
} else {
12+
addBinaryTreeNode(root.Left, val)
13+
}
14+
return
15+
}
16+
if root.Right == nil {
17+
node := new(TreeNode)
18+
node.Val = val
19+
root.Right = node
20+
} else {
21+
addBinaryTreeNode(root.Right, val)
22+
}
23+
}
24+
25+
func bstFromPreorder(preorder []int) *TreeNode {
26+
if len(preorder) == 0 {
27+
return nil
28+
}
29+
root := new(TreeNode)
30+
root.Val = preorder[0]
31+
for i := 1; i < len(preorder); i++ {
32+
addBinaryTreeNode(root, preorder[i])
33+
}
34+
35+
return root
36+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package leetcode
2+
3+
import "testing"
4+
5+
func TestBstFromPreorder(t *testing.T) {
6+
tests := []struct {
7+
preorder []int
8+
expect []int
9+
}{
10+
{
11+
preorder: []int{8, 5, 1, 7, 10, 12},
12+
expect: []int{8, 5, 10, 1, 7, -1, 12},
13+
}, {
14+
preorder: []int{},
15+
expect: []int{},
16+
}, {
17+
preorder: []int{8},
18+
expect: []int{8},
19+
}, {
20+
preorder: []int{8, 2, 9},
21+
expect: []int{8, 2, 9},
22+
},
23+
}
24+
25+
for i, item := range tests {
26+
actual := bstFromPreorder(item.preorder)
27+
actualData := treeToSlice(actual, -1)
28+
if !intsEqual(actualData, item.expect) {
29+
t.Errorf("%d expect %v, actual %v", i, item.expect, actualData)
30+
}
31+
}
32+
}

go/tree-node.go

Lines changed: 48 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,47 @@ type TreeNode struct {
77
Right *TreeNode
88
}
99

10+
func treeToSlice(root *TreeNode, d int) []int {
11+
if root == nil {
12+
return make([]int, 0)
13+
}
14+
nodes := make([]*TreeNode, 64)
15+
vals := make([]int, 64)
16+
nodes[0] = root
17+
index := 0
18+
nodeMax := 0
19+
for {
20+
if index > nodeMax {
21+
break
22+
}
23+
if nodes[index] == nil {
24+
vals[index] = d
25+
index++
26+
continue
27+
}
28+
newSize := (index + 1) * 2
29+
if newSize > len(vals) {
30+
newNodes := make([]*TreeNode, (len(vals)+1)*2)
31+
copy(newNodes, nodes)
32+
nodes = newNodes
33+
newVals := make([]int, (len(vals)+1)*2)
34+
copy(newVals, vals)
35+
vals = newVals
36+
}
37+
vals[index] = nodes[index].Val
38+
if nodes[index].Left != nil {
39+
nodeMax = index*2 + 1
40+
nodes[index*2+1] = nodes[index].Left
41+
}
42+
if nodes[index].Right != nil {
43+
nodeMax = index*2 + 2
44+
nodes[index*2+2] = nodes[index].Right
45+
}
46+
index++
47+
}
48+
return vals[:index]
49+
}
50+
1051
func buildTree(vals []int, x int) *TreeNode {
1152
nodes := make([]*TreeNode, len(vals)+1)
1253
for i := 0; i < len(vals); i++ {
@@ -18,20 +59,20 @@ func buildTree(vals []int, x int) *TreeNode {
1859
nodes[i].Val = vals[i]
1960
}
2061

21-
for i := 0; i < len(vals)/2; i++ {
62+
for i := 0; i < len(vals)/2+1; i++ {
2263
if nodes[i] == nil {
2364
continue
2465
}
2566
left := i*2 + 1
2667
right := left + 1
27-
if left > len(vals) {
28-
continue
68+
if left >= len(vals) {
69+
break
2970
}
30-
nodes[i].Left = nodes[i*2+1]
31-
if right > len(vals) {
32-
continue
71+
nodes[i].Left = nodes[left]
72+
if right >= len(vals) {
73+
break
3374
}
34-
nodes[i].Right = nodes[i*2+2]
75+
nodes[i].Right = nodes[right]
3576
}
3677

3778
return nodes[0]

go/tree-node_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package leetcode
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestTree(t *testing.T) {
8+
tests := []struct {
9+
vals []int
10+
x int
11+
}{
12+
{
13+
vals: []int{8, 5, 10, 1, 7, -1, 12},
14+
x: -1,
15+
}, {
16+
vals: []int{8},
17+
x: -1,
18+
},
19+
}
20+
for _, item := range tests {
21+
root := buildTree(item.vals, item.x)
22+
actual := treeToSlice(root, item.x)
23+
24+
if !intsEqual(actual, item.vals) {
25+
t.Fatalf("\nexpect %v \nactual %v\n", item.vals, actual)
26+
}
27+
}
28+
}

0 commit comments

Comments
 (0)