go实现二叉树

180 阅读1分钟

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