Merge pull request #304 from yigenshutiao/master
add 3 types traversal and test of binary tree
This commit is contained in:
commit
cc1fddf584
66
go/23_binarytree/binarytree.go
Normal file
66
go/23_binarytree/binarytree.go
Normal file
@ -0,0 +1,66 @@
|
||||
package binarytree
|
||||
|
||||
type TreeNode struct {
|
||||
Val int
|
||||
Left *TreeNode
|
||||
Right *TreeNode
|
||||
}
|
||||
|
||||
func preOrderTraversal(root *TreeNode) []int {
|
||||
if root == nil {
|
||||
return nil
|
||||
}
|
||||
if root.Left == nil && root.Right == nil {
|
||||
return []int{root.Val}
|
||||
}
|
||||
var stack []*TreeNode
|
||||
var res []int
|
||||
stack = append(stack, root)
|
||||
for len(stack) != 0 {
|
||||
e := stack[len(stack)-1]
|
||||
stack = stack[:len(stack)-1]
|
||||
res = append(res, e.Val)
|
||||
if e.Right != nil {
|
||||
stack = append(stack, e.Right)
|
||||
}
|
||||
if e.Left != nil {
|
||||
stack = append(stack, e.Left)
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
func inOrderTraversal(root *TreeNode) []int {
|
||||
if root == nil {
|
||||
return nil
|
||||
}
|
||||
if root.Left == nil && root.Right == nil {
|
||||
return []int{root.Val}
|
||||
}
|
||||
res := inOrderTraversal(root.Left)
|
||||
res = append(res, root.Val)
|
||||
res = append(res, inOrderTraversal(root.Right)...)
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
func postOrderTraversal(root *TreeNode) []int {
|
||||
if root == nil {
|
||||
return nil
|
||||
}
|
||||
var res []int
|
||||
if root.Left != nil {
|
||||
lres := postOrderTraversal(root.Left)
|
||||
if len(lres) > 0 {
|
||||
res = append(res, lres...)
|
||||
}
|
||||
}
|
||||
if root.Right != nil {
|
||||
rres := postOrderTraversal(root.Right)
|
||||
if len(rres) > 0 {
|
||||
res = append(res, rres...)
|
||||
}
|
||||
}
|
||||
res = append(res, root.Val)
|
||||
return res
|
||||
}
|
94
go/23_binarytree/binarytree_test.go
Normal file
94
go/23_binarytree/binarytree_test.go
Normal file
@ -0,0 +1,94 @@
|
||||
package binarytree
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
var tcs = []struct {
|
||||
pre, in, post []int
|
||||
}{
|
||||
|
||||
{
|
||||
[]int{1, 2, 3},
|
||||
[]int{1, 3, 2},
|
||||
[]int{3, 2, 1},
|
||||
},
|
||||
|
||||
{
|
||||
[]int{1, 2, 4, 5, 3, 6, 7},
|
||||
[]int{4, 2, 5, 1, 6, 3, 7},
|
||||
[]int{4, 5, 2, 6, 7, 3, 1},
|
||||
},
|
||||
// 可以有多个 testCase
|
||||
}
|
||||
|
||||
func PreIn2Tree(pre, in []int) *TreeNode {
|
||||
if len(pre) != len(in) {
|
||||
panic("preIn2Tree 中两个切片的长度不相等")
|
||||
}
|
||||
|
||||
if len(in) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
res := &TreeNode{
|
||||
Val: pre[0],
|
||||
}
|
||||
|
||||
if len(in) == 1 {
|
||||
return res
|
||||
}
|
||||
|
||||
idx := indexOf(res.Val, in)
|
||||
|
||||
res.Left = PreIn2Tree(pre[1:idx+1], in[:idx])
|
||||
res.Right = PreIn2Tree(pre[idx+1:], in[idx+1:])
|
||||
|
||||
return res
|
||||
}
|
||||
|
||||
func indexOf(val int, nums []int) int {
|
||||
for i, v := range nums {
|
||||
if v == val {
|
||||
return i
|
||||
}
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
func Test_preOrderTraversal(t *testing.T) {
|
||||
ast := assert.New(t)
|
||||
|
||||
for _, tc := range tcs {
|
||||
fmt.Printf("~~%v~~\n", tc)
|
||||
|
||||
root := PreIn2Tree(tc.pre, tc.in)
|
||||
ast.Equal(tc.pre, preOrderTraversal(root), "输入:%v", tc)
|
||||
}
|
||||
}
|
||||
|
||||
func Test_inOrderTraversal(t *testing.T) {
|
||||
ast := assert.New(t)
|
||||
|
||||
for _, tc := range tcs {
|
||||
fmt.Printf("~~%v~~\n", tc)
|
||||
|
||||
root := PreIn2Tree(tc.pre, tc.in)
|
||||
ast.Equal(tc.in, inOrderTraversal(root), "输入:%v", tc)
|
||||
}
|
||||
}
|
||||
|
||||
func Test_postOrderTraversal(t *testing.T) {
|
||||
ast := assert.New(t)
|
||||
|
||||
for _, tc := range tcs {
|
||||
fmt.Printf("~~%v~~\n", tc)
|
||||
|
||||
root := PreIn2Tree(tc.pre, tc.in)
|
||||
ast.Equal(tc.post, postOrderTraversal(root), "输入:%v", tc)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user