Skip to content

Commit d5bba3b

Browse files
committed
add solution for construct binary tree from inorder and postorder
traversal
1 parent 5b4d11a commit d5bba3b

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package leetcode
2+
3+
func findInorderIndex(inorder []int, val int) int {
4+
for pos := 0; pos < len(inorder); pos++ {
5+
if inorder[pos] == val {
6+
return pos
7+
}
8+
}
9+
return -1
10+
}
11+
12+
func ipbuildTree(inorder []int, postorder []int) *TreeNode {
13+
// fmt.Printf("-- %v %v\n", inorder, postorder)
14+
length := len(postorder)
15+
if length == 0 {
16+
return nil
17+
}
18+
root := new(TreeNode)
19+
root.Val = postorder[length-1]
20+
if len(postorder) == 1 {
21+
return root
22+
}
23+
24+
rootInorderPos := findInorderIndex(inorder, root.Val)
25+
leftNodeNumbers := rootInorderPos
26+
root.Left = ipbuildTree(inorder[:rootInorderPos], postorder[:leftNodeNumbers])
27+
root.Right = ipbuildTree(inorder[rootInorderPos+1:], postorder[leftNodeNumbers:len(postorder)-1])
28+
29+
return root
30+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package leetcode
2+
3+
import "testing"
4+
5+
func TestBuildTree(t *testing.T) {
6+
tests := []struct {
7+
inorder []int
8+
postorder []int
9+
expect []int
10+
}{
11+
{
12+
inorder: []int{1, 2, 3, 4, 5},
13+
postorder: []int{2, 1, 5, 4, 3},
14+
expect: []int{3, 1, 4, -1, 2, -1, 5},
15+
}, {
16+
inorder: []int{1, 2, 3, 4},
17+
postorder: []int{4, 3, 2, 1},
18+
expect: []int{1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, 4},
19+
}, {
20+
inorder: []int{9, 3, 15, 20, 7},
21+
postorder: []int{9, 15, 7, 20, 3},
22+
expect: []int{3, 9, 20, -1, -1, 15, 7},
23+
}, {
24+
inorder: []int{9},
25+
postorder: []int{9},
26+
expect: []int{9},
27+
}, {
28+
inorder: []int{3, 9, 1},
29+
postorder: []int{3, 9, 1},
30+
expect: []int{1, 9, -1, 3},
31+
}, {
32+
inorder: []int{3, 2, 1},
33+
postorder: []int{3, 2, 1},
34+
expect: []int{1, 2, -1, 3},
35+
},
36+
}
37+
38+
for i, item := range tests {
39+
tree := ipbuildTree(item.inorder, item.postorder)
40+
actual := treeToSlice(tree, -1)
41+
if !intsEqual(item.expect, actual) {
42+
t.Fatalf("\n%d\nexpect %v\nactual %v", i, item.expect, actual)
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)