golang数据结构二叉树遍历

什么是二叉树

二叉树(Binary tree):是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分。

二叉树图

A
B
D
H
E
I
C
F
J
K
G

先序遍历

先序:是二叉树遍历中的一种,即先访问根结点,然后遍历左子树,后遍历右子树。遍历左、右子树时,先访问根结点,后遍历左子树,后遍历右子树,如果二叉树为空则返回。

package main
import "fmt"
type node struct {
	value     string
	leftNode  *node
	rightNode *node
}
func main() {
	n := node{}
	node := n.newTree()
	n.Show(node)
}
// 前序遍历  根左右
func (n *node) Show(node *node) {
	if node != nil {
		fmt.Print(node.value)
		n.Show(node.leftNode)
		n.Show(node.rightNode)
	}
}
// 构造二叉树   返回根节点
func (n *node) newTree() *node {
	nodeA := &node{
		value: "A",
	}
	nodeB := &node{
		value: "B",
	}
	nodeC := &node{
		value: "C",
	}
	nodeD := &node{
		value: "D",
	}
	nodeE := &node{
		value: "E",
	}
	nodeF := &node{
		value: "F",
	}
	nodeG := &node{
		value: "G",
	}
	nodeH := &node{
		value: "H",
	}
	nodeI := &node{
		value: "I",
	}
	nodeJ := &node{
		value: "J",
	}
	nodeK := &node{
		value: "K",
	}
	nodeA.leftNode = nodeB
	nodeA.rightNode = nodeC
	nodeB.leftNode = nodeD
	nodeB.rightNode = nodeE
	nodeC.leftNode = nodeF
	nodeC.rightNode = nodeG
	nodeD.rightNode = nodeH
	nodeE.rightNode = nodeI
	nodeF.leftNode = nodeJ
	nodeF.rightNode = nodeK
	fmt.Print("先序:")
	return nodeA
}

中序遍历

中序:是二叉树遍历中的一种,即先遍历左子树,后访问根结点,然后遍历右子树。若二叉树为空则结束返回。

package main
import "fmt"
type node struct {
	value     string
	leftNode  *node
	rightNode *node
}

func main() {
	n := node{}
	node := n.newTree()
	n.Show(node)
}

// 中序遍历  左根右
func (n *node) Show(node *node) {
	if node != nil {
		n.Show(node.leftNode)
		fmt.Print(node.value)
		n.Show(node.rightNode)
	}
}

// 构造二叉树   返回根节点
func (n *node) newTree() *node {
	nodeA := &node{
		value: "A",
	}
	nodeB := &node{
		value: "B",
	}
	nodeC := &node{
		value: "C",
	}
	nodeD := &node{
		value: "D",
	}
	nodeE := &node{
		value: "E",
	}
	nodeF := &node{
		value: "F",
	}
	nodeG := &node{
		value: "G",
	}
	nodeH := &node{
		value: "H",
	}
	nodeI := &node{
		value: "I",
	}
	nodeJ := &node{
		value: "J",
	}
	nodeK := &node{
		value: "K",
	}
	nodeA.leftNode = nodeB
	nodeA.rightNode = nodeC
	nodeB.leftNode = nodeD
	nodeB.rightNode = nodeE
	nodeC.leftNode = nodeF
	nodeC.rightNode = nodeG
	nodeD.rightNode = nodeH
	nodeE.rightNode = nodeI
	nodeF.leftNode = nodeJ
	nodeF.rightNode = nodeK
	fmt.Print("中序:")
	return nodeA
}

后序遍历

后序:是二叉树遍历中的一种,即先遍历左子树,后遍历右子树,然后访问根结点,遍历左、右子树时,仍先遍历左子树,后遍历右子树,最后遍历根结点。

package main
import "fmt"
type node struct {
	value     string
	leftNode  *node
	rightNode *node
}
func main() {
	n := node{}
	node := n.newTree()
	n.Show(node)
}
// 后序遍历  左右根
func (n *node) Show(node *node) {
	if node != nil {
		n.Show(node.leftNode)
		n.Show(node.rightNode)
		fmt.Print(node.value)
	}
}
// 构造二叉树   返回根节点
func (n *node) newTree() *node {
	nodeA := &node{
		value: "A",
	}
	nodeB := &node{
		value: "B",
	}
	nodeC := &node{
		value: "C",
	}
	nodeD := &node{
		value: "D",
	}
	nodeE := &node{
		value: "E",
	}
	nodeF := &node{
		value: "F",
	}
	nodeG := &node{
		value: "G",
	}
	nodeH := &node{
		value: "H",
	}
	nodeI := &node{
		value: "I",
	}
	nodeJ := &node{
		value: "J",
	}
	nodeK := &node{
		value: "K",
	}
	nodeA.leftNode = nodeB
	nodeA.rightNode = nodeC
	nodeB.leftNode = nodeD
	nodeB.rightNode = nodeE
	nodeC.leftNode = nodeF
	nodeC.rightNode = nodeG
	nodeD.rightNode = nodeH
	nodeE.rightNode = nodeI
	nodeF.leftNode = nodeJ
	nodeF.rightNode = nodeK
	fmt.Print("后序:")
	return nodeA
}

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北岛末巷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值