go实现二叉树

本文介绍了如何使用Go语言实现一个二叉搜索树,包括节点结构、插入操作、层次遍历、前中后序遍历以及计算树高和查找叶子节点。通过实例展示了如何构造并操作二叉树的数据结构。
package main

import (
    "fmt"
)

// 节点 type BinaryTreeNode struct { Data int Left *BinaryTreeNode Right *BinaryTreeNode }
// 创建节点 func CreateBinaryTree(data int) *BinaryTreeNode { return &BinaryTreeNode{data, nil, nil} }
// 插入节点 func (node *BinaryTreeNode) Insert(n *BinaryTreeNode, data int) bool { cur := n for cur != nil { if cur.Data < data { if cur.Right != nil { cur = cur.Right } else { cur.Right = CreateBinaryTree(data) return true } } else { if cur.Left != nil { cur = cur.Left } else { cur.Left = CreateBinaryTree(data) fmt.Println(data, "d---") return true } } } return false }
// 层数打印 func (node *BinaryTreeNode) BreadthFirstSearch() []int { if node == nil { return nil } var result []int par := node cur := []*BinaryTreeNode{par} for len(cur) > 0 { result = append(result, cur[0].Data) if cur[0].Left != nil { cur = append(cur, cur[0].Left) } if cur[0].Right != nil { cur = append(cur, cur[0].Right) } cur = cur[1:] } return result }
// 前序打印 func (node *BinaryTreeNode) PreOrder(n *BinaryTreeNode) { if n != nil { fmt.Println(n.Data) node.PreOrder(n.Left) node.PreOrder(n.Right) } }
// 中序打印 func (node *BinaryTreeNode) InOrder(n *BinaryTreeNode) { if n != nil { node.InOrder(n.Left) fmt.Println(n.Data) node.InOrder(n.Right) } }
// 后序打印 func (node *BinaryTreeNode) PostOrder(n *BinaryTreeNode) { if n != nil { node.InOrder(n.Left) node.InOrder(n.Right) fmt.Println(n.Data) } }
// 获取树的高度 func (node *BinaryTreeNode) GetHight(n *BinaryTreeNode) int { if n == nil { return 0 } l := node.GetHight(n.Left) r := node.GetHight(n.Right) if l > r { return l + 1 } else { return r + 1 } }
// 打印叶子节点 func (node *BinaryTreeNode) FindLead(n *BinaryTreeNode) { if n != nil { if n.Left == nil && n.Right == nil { fmt.Println(n.Data) } node.FindLead(n.Left) node.FindLead(n.Right) } }
// 查找指定值的节点 func (node *BinaryTreeNode) FindValueNode(n *BinaryTreeNode, target int) *BinaryTreeNode { if n == nil { return nil } else if n.Data == target { return n } else { cur := node.FindValueNode(n.Left, target) if cur != nil { return cur } return node.FindValueNode(n.Right, target) } } func main() { var node *BinaryTreeNode
   // 创建一个根节点 node = CreateBinaryTree(10) li := []int{9, 11, 8, 5, 6, 4, 12, 15, 18, 17}
   // 创建一个二叉树 for _, val := range li { node.Insert(node, val) } ret := node.BreadthFirstSearch() fmt.Println(ret) node.PreOrder(node) node.InOrder(node) node.PostOrder(node) res := node.GetHight(node) fmt.Println(res) node.FindLead(node) ref := node.FindValueNode(node, 17) fmt.Println(ref) }

结束!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值