golang实现二叉树,代码如下:
/*
go实现二叉树的前序、中序、后序、层序遍历
运行 go run main.go
*/
package main
import (
"container/list"
"fmt"
)
// TreeNode represents a node in the binary tree.
type TreeNode struct {
Value int
Left *TreeNode
Right *TreeNode
}
// NewTreeNode creates a new TreeNode with the given value.
func NewTreeNode(value int) *TreeNode {
return &TreeNode{Value: value}
}
// Insert inserts a new node with the given value into the binary tree.
func (t *TreeNode) Insert(value int) {
if t == nil {
return // 如果树为空,则不做任何操作
}
// 如果插入的值小于当前节点的值,则插入到左子树,否则插入到右子树
if value < t.Value {
if t.Left == nil {
t.Left = NewTreeNode(value)
} else {
t.Left.Insert(value)
}
} else {
if t.Right == nil {
t.Right = NewTreeNode(value)
} else {
t.Right.Insert(value)
}
}
}
// 前序遍历
func (t *TreeNode) PreOrderTraversal() {
if t != nil {
fmt.Print(t.Value, " ")
t.Left.PreOrderTraversal()
t.Right.PreOrderTraversal()
}
}
// 中序遍历
func (t *TreeNode) InOrderTraversal() {
if t != nil {
t.Left.InOrderTraversal()
fmt.Print(t.Value, " ")
t.Right.InOrderTraversal()
}
}
// 后序遍历
func (t *TreeNode) PostOrderTraversal() {
if t != nil {
t.Left.PostOrderTraversal()
t.Right.PostOrderTraversal()
fmt.Print(t.Value, " ")
}
}
// 层序遍历
func (t *TreeNode) LevelOrderTraversal() {
if t == nil {
return
}
queue := list.New()
queue.PushBack(t)
for queue.Len() > 0 {
node := queue.Remove(queue.Front()).(*TreeNode)
fmt.Print(node.Value, " ")
if node.Left != nil {
queue.PushBack(node.Left)
}
if node.Right != nil {
queue.PushBack(node.Right)
}
}
}
func main() {
// 创建一个根节点
root := NewTreeNode(10)
// 向二叉树中插入节点
root.Insert(5)
root.Insert(15)
root.Insert(3)
root.Insert(7)
root.Insert(13)
root.Insert(17)
fmt.Println("前序遍历:")
root.PreOrderTraversal()
fmt.Println()
fmt.Println("中序遍历:")
root.InOrderTraversal()
fmt.Println()
fmt.Println("后序遍历:")
root.PostOrderTraversal()
fmt.Println()
fmt.Println("层序遍历:")
root.LevelOrderTraversal()
fmt.Println()
}
运行结果
前序遍历: 10 5 3 7 15 13 17
中序遍历: 3 5 7 10 13 15 17
后序遍历: 3 7 5 13 17 15 10
层序遍历: 10 5 15 3 7 13 17