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 }
该实例生成的二叉树如下:
一些短而有意境的句子我走过的漫长的道路并不总是铺着玫瑰花的,有时也荆棘丛生。季羡林与怪物战斗的人应当小心自己不要成为怪物,当你远远凝视深渊时,深渊也在凝视你。尼采善恶的彼岸自身拥有越丰富,他在别人身上
满足是快乐,不满是期待有一个传说,说的是有那么一只鸟儿,它一生只唱一次,那歌声比世上所有一切生灵的歌声都更加优美动听。从离开巢窝的那一刻起,它就在寻找着荆棘树,直到如愿以偿,才歇息下来。然后,它把自己的
你该如何屹立于天地之间?你这辈子做得最有种的事情是什么?是从别人羡慕的岗位离职出来自己创业?还是自己想当老板的野心?其实都不是,从一开始,我并没有那么大的野心,我只是想做个好职员,最多想成为一名优秀的工作
人的行为是最好的风水师谣零零计划老甄絮语退后一步,行安乐法,道三个好,结欢喜缘。人生快乐不快乐看心情,心情好不好看心态,心态平不平看行为。人的行为就是最好的风水,我们都应该择善而行。海阔天空,任凭风吹麦
随笔开悟开悟什么意思?就是开窍,以前不懂的,突然就理解了。我理解的开悟,有两个层面。一个是链接,一个是实事求是。开悟说得简单,就是突然明白了。但实际上是非常困难的,需要阅历经历经验等积累。
昆明小故宫你还不知道?带你梦回前朝说起文庙,相信没有昆明人会不认识它,但人们总是只在门口停留,或是步履匆匆路过千百次,却从未涉足。今天一定要带大家好好逛逛文庙,感受那一砖一瓦间的昆明历史。文庙建于1276年,在我国
上个世纪八十年代最具有代表作的十二篇湖南旅游文学作品上个世纪八十年代最具有代表作的十二篇湖南旅游文学作品1悠悠的猛洞河作者银云(散文)影响力五星2沅陵,那遥远的山城作者刘学稼(散文)影响力五星3指点巴陵胜景作者郑降肖(报告文学)影响
中国版66号公路,赞在河北张家口,有着一条有中国版66号公路之称的草原天路。下面就让我们一起体验,骑骏马,打铁花,放声高歌,大快朵颐的游牧生活吧!天苍苍,野茫茫,风吹草低见牛羊。这一次的行程将尚义张北
既好奇又想沾沾喜气!2名女子旅游遇婚宴随礼200元吃席姐妹俩去广西柳州旅游,在路边散步不知道吃什么,偶然看到一酒店新人在办婚宴,正好身上有红包,在门口犹豫了很久,最后还是鼓起勇气随礼200元参加婚宴,吃了席。这个可以有,受到启发了,超
大快人心!意媒目中无人看衰中国女排,国际排联用8个字快速反击2022年女排世锦赛四分之一决赛即将于今晚打响,根据今年世锦赛的最新赛制,四强名额争夺赛将采取一场定胜负。赢下比赛就能拿到四强名额继续冲击奖牌而失利者则只能一失足成千古恨灰溜溜的黯
黄圣依真有贵妇感,穿低胸薄纱连衣裙,魔鬼身材太令人心动黄圣依是自从出道以来就以她出众的颜值惊艳了很多人,虽然现如今的她已经结婚多年,而且越来越低调,但出现在大众视线中仍然维持着较好的面貌,这一次黄圣依穿上一条低胸的薄纱连衣裙,看上去真