go語言實現二叉樹遍歷

代碼如下

package main

import (
	"fmt"
)

type Node struct {
	Value       string
	Left, Right *Node
}

func (node *Node) Print() {
	fmt.Print(node.Value, " ")
}

func (node *Node) SetValue(v string) {
	if node == nil {
		fmt.Println("setting value to nil.node ignored.")
		return
	}
	node.Value = v
}

//前序遍歷
func (node *Node) PreOrder() {
	if node == nil {
		return
	}
	node.Print()
	node.Left.PreOrder()
	node.Right.PreOrder()
}

//中序遍歷
func (node *Node) MiddleOrder() {
	if node == nil {
		return
	}
	node.Left.MiddleOrder()
	node.Print()
	node.Right.MiddleOrder()
}

//後序遍歷
func (node *Node) PostOrder() {
	if node == nil {
		return
	}
	node.Left.PostOrder()
	node.Right.PostOrder()
	node.Print()
}

//層次遍歷(廣度優先遍歷)
func (node *Node) BreadthFirstSearch() {
	if node == nil {
		return
	}
	result := []string{}
	nodes := []*Node{node}
	for len(nodes) > 0 {
		curNode := nodes[0]
		nodes = nodes[1:]
		result = append(result, curNode.Value)
		if curNode.Left != nil {
			nodes = append(nodes, curNode.Left)
		}
		if curNode.Right != nil {
			nodes = append(nodes, curNode.Right)
		}
	}
	for _, v := range result {
		fmt.Print(v, " ")
	}
}

//層數(遞歸實現)
//對任意一個子樹的根節點來說,它的深度=左右子樹深度的最大值+1
func (node *Node) Layers() int {
	if node == nil {
		return 0
	}
	leftLayers := node.Left.Layers()
	rightLayers := node.Right.Layers()
	if leftLayers > rightLayers {
		return leftLayers + 1
	} else {
		return rightLayers + 1
	}
}

//層數(非遞歸實現)
//藉助隊列,在進行按層遍歷時,記錄遍歷的層數即可
func (node *Node) LayersByQueue() int {
	if node == nil {
		return 0
	}
	layers := 0
	nodes := []*Node{node}
	for len(nodes) > 0 {
		layers++
		size := len(nodes) //每層的節點數
		count := 0
		for count < size {
			count++
			curNode := nodes[0]
			nodes = nodes[1:]
			if curNode.Left != nil {
				nodes = append(nodes, curNode.Left)
			}
			if curNode.Right != nil {
				nodes = append(nodes, curNode.Right)
			}
		}
	}
	return layers
}

func CreateNode(v string) *Node {
	return &Node{Value: v}
}

func main() {
	root := Node{Value: "A"}
	root.Left = &Node{}
	root.Left.SetValue("B")
	root.Left.Right = CreateNode("C")
	root.Right = &Node{"D", nil, nil}
	root.Right.Left = CreateNode("E")

	fmt.Print("\n前序遍歷: ")
	root.PreOrder()
	fmt.Print("\n中序遍歷: ")
	root.MiddleOrder()
	fmt.Print("\n後序遍歷: ")
	root.PostOrder()
	fmt.Print("\n層次遍歷: ")
	root.BreadthFirstSearch()
	fmt.Println("\n層數: ", root.Layers())
	fmt.Println("\n層數: ", root.LayersByQueue())}
	```
**結果如下:**
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/2020070412234283.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzMxODUwNg==,size_16,color_FFFFFF,t_70)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章