范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Go语言实现二叉树

  1、定义结点 package main  import (     "fmt" )  // 定义结点 type BinaryTreeNode struct {     Data  int     Left  *BinaryTreeNode     Right *BinaryTreeNode }
  2、创建结点 // 创建结点 func CreateBinaryTree(data int) *BinaryTreeNode {     return &BinaryTreeNode{data, nil, nil} }
  3、数据插入 // 插入结点 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 }
  4、层序遍历 // 层数打印 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 }
  5、前序遍历 // 前序打印 func (node *BinaryTreeNode) PreOrder(n *BinaryTreeNode) {     if n != nil {         fmt.Println(n.Data)         node.PreOrder(n.Left)         node.PreOrder(n.Right)     } }
  6、中序遍历 // 中序打印 func (node *BinaryTreeNode) InOrder(n *BinaryTreeNode) {     if n != nil {         node.InOrder(n.Left)         fmt.Println(n.Data)         node.InOrder(n.Right)     } }
  7、后序遍历 // 后序打印 func (node *BinaryTreeNode) PostOrder(n *BinaryTreeNode) {     if n != nil {         node.InOrder(n.Left)         node.InOrder(n.Right)         fmt.Println(n.Data)     } }
  8、获取树的高度 // 获取树的高度 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     } }
  9、打印叶子结点 // 打印叶子节点 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)     } }
  10、查找指定值的节点 // 查找指定值的节点 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)     } }
  11、主函数 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) }
  12、运行结果 9 d--- 8 d--- 5 d--- 4 d--- 17 d--- [10 9 11 8 12 5 15 4 6 18 17] 10 9 8 5 4 6 11 12 15 18 17 4 5 6 8 9 10 11 12 15 17 18 4 5 6 8 9 11 12 15 17 18 10 6 4 6 17 &{17  }
  该实例生成的二叉树如下:

足坛精彩一夜!拜仁造5球惨案,巴萨不敌国米,欧冠4冠王16惨败北京时间10月5日凌晨,欧冠小组赛第三轮重燃战火,拜仁,利物浦,巴萨等多家豪门先后出场亮相。本轮拜仁大胜比尔森胜利,继续领跑死亡之组,巴萨则是01客场输给国米,遭遇两连败。利物浦主第十七届省运会开闭幕式排练启动大武夷新闻网讯2日,第十七届省运会开闭幕式排练启动仪式在武夷学院体育馆举行,标志着武夷学院省运会志愿服务工作由遴选招募转向全面备战阶段。副市长林湫,市政协副主席体育局局长杨志平参加欧冠最新积分榜拜仁携大黑马豪取3连胜,国米力克巴萨攀升第2今天凌晨,欧冠小组赛第3轮先战8场,国米主场10击败巴萨,恰尔汗奥卢破门拜仁主场50横扫比尔森胜利,取得3连胜那不勒斯客场61大胜阿贾克斯,同样取得3连胜大黑马布鲁日主场20击败马20,创最佳开局!欧冠大黑马狂飙,3连胜1球未丢,送马竞2连败北京时间10月5日凌晨,欧冠小组赛第3轮全面开打,位于B组的2场比赛同时结束,布鲁日主场20战胜马德里竞技,豪取一波3连胜且1球未丢,创造队史小组赛最佳开局。此外,波尔图主场20战队报身材瘦高但身板结实,埃基蒂克被梅西起了铁棒绰号直播吧10月1日讯据队报报道,在星光熠熠的巴黎圣日耳曼更衣室,新援埃基蒂克尽管仍在适应,但法国U20国脚和梅西有着良好的关系。据称,梅西为埃基蒂克起了铁棒的绰号,这是因为他瘦高的体(体育)女排世锦赛综合美国塞尔维亚提前晋级,意大利四连胜新华社荷兰阿纳姆9月30日电(记者刘旸王湘江)2022世界女排锦标赛日前在荷兰和波兰的三座城市进行了8场比赛,同在C组的美国队和塞尔维亚队分别击败对手,提前锁定16强席位。意大利队170!哈兰德完爆姆巴佩,领跑新双骄之争,金球奖稳了只要你看过足球,那你就一定听过梅西和C罗的名字。作为统治了世界足坛十余年的顶级球星,这两位可以说是开创了一个时代,梅罗争霸的故事,至今仍被不少球迷津津乐道。但是强如梅西C罗,也抵不李梦发文庆祝女篮获银牌,遭网友嘲讽发烧打一针上啊,矫情10月1日,中国女篮拿下世界杯亚军。这是个很了不起的成绩,赛后队员李梦发微博庆祝夺得银牌我们拿到世界杯银牌了!时隔多年,能重新站上世界舞台的领奖台,是一份成绩,更是新的动力!感谢我雨果30横扫,晋级世乒赛淘汰赛10月4日,成都世乒赛男团小组赛第6小组的生死战,同样都是1胜1负的巴西队与斯洛伐克队遭遇,最终巴西队30战胜了对手,当家球星雨果32险胜削球手汪洋。第一盘,巴西队雨果对阵斯洛伐克下午13点!李盈莹传来重大喜讯国际排联官宣重要信息,球迷振奋北京时间10月3日下午13点,中国女排传来最新消息,据国内媒体新浪体育报道,国际排联通过官方网站宣布了球员的技术统计,在最新的榜单中,李盈莹的扣球,一传,得分都位列前三,而这样的表我与世界杯的缘足球助力团我与世界杯第一次结缘于2002年,那一年的韩日世界杯,印象最深的人是罗纳尔多,印象最深的比赛是世界杯决赛巴西对战德国,罗纳尔多的两粒进球帮助巴西2比0战胜德国。那一年还有