Go语言二叉树的实现

package main

import "fmt"

//定义二叉树的节点
type Node struct {
	value int
	left *Node
	right *Node
}

//功能:打印节点的值
//参数:nil
//返回值:nil
func (node *Node)Print() {
	fmt.Printf("%d ", node.value)
}

//功能:设置节点的值
//参数:节点的值
//返回值:nil
func (node *Node)SetValue(value int) {
	node.value = value
}

//功能:创建节点
//参数:节点的值
//返回值:nil
func CreateNode(value int) *Node {
	return &Node{value,nil,nil}
}

//功能:查找节点,利用递归进行查找
//参数:根节点,查找的值
//返回值:查找值所在节点
func (node *Node)FindNode(n *Node, x int) *Node {
	if n == nil {
		return nil
	}else if n.value == x {
		return n
	}else {
		p := node.FindNode(n.left, x)
		if p != nil {
			return p
		}
		return node.FindNode(n.right, x)
	}
}

//功能:求树的高度
//参数:根节点
//返回值:树的高度,树的高度=Max(左子树高度,右子树高度)+1
func (node *Node)GetTreeHeigh(n *Node) int {
	if n == nil {
		return 0
	}else {
		lHeigh := node.GetTreeHeigh(n.left)
		rHeigh := node.GetTreeHeigh(n.right)
		if lHeigh > rHeigh {
			return lHeigh+1
		}else {
			return rHeigh+1
		}
	}
}

//功能:递归前序遍历二叉树
//参数:根节点
//返回值:nil
func (node *Node)PreOrder(n *Node) {
	if n != nil {
		fmt.Printf("%d ", n.value)
		node.PreOrder(n.left)
		node.PreOrder(n.right)
	}
}

//功能:递归中序遍历二叉树
//参数:根节点
//返回值:nil
func (node *Node)InOrder(n *Node) {
	if n != nil {
		node.InOrder(n.left)
		fmt.Printf("%d ", n.value)
		node.InOrder(n.right)
	}
}

//功能:递归后序遍历二叉树
//参数:根节点
//返回值:nil
func (node *Node)PostOrder(n *Node) {
	if n != nil {
		node.PostOrder(n.left)
		node.PostOrder(n.right)
		fmt.Printf("%d ", n.value)
	}
}

//功能:打印所有的叶子节点
//参数:root
//返回值:nil
func (node *Node)GetLeafNode(n *Node) {
	if n != nil {
		if n.left == nil && n.right == nil {
			fmt.Printf("%d ", n.value)
		}
		node.GetLeafNode(n.left)
		node.GetLeafNode(n.right)
	}
}

func main() {
	//创建一颗树
	root := CreateNode(5)
	root.left = CreateNode(2)
	root.right = CreateNode(4)
	root.left.right = CreateNode(7)
	root.left.right.left = CreateNode(6)
	root.right.left = CreateNode(8)
	root.right.right = CreateNode(9)

	fmt.Printf("%d\n", root.FindNode(root, 4).value)
	fmt.Printf("%d\n", root.GetTreeHeigh(root))

	root.PreOrder(root)
	fmt.Printf("\n")
	root.InOrder(root)
	fmt.Printf("\n")
	root.PostOrder(root)
	fmt.Printf("\n")

	root.GetLeafNode(root)
	fmt.Printf("\n")
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值