加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Golang以OO的方式实现二叉查找树

发布时间:2020-12-16 09:42:57 所属栏目:大数据 来源:网络整理
导读:二叉查找树 是一种满足如下性质的二叉树: (1) 某个节点的左子树中的所有节点的值都比这个节点的值小 (2) 某个节点的右子树中的所有节点的值都比这个节点的值大 下面有Go实现的非常详尽的代码,采用了Go风格的OO进行了封装。代码中主函数的例子的参照图如下

二叉查找树是一种满足如下性质的二叉树:

(1) 某个节点的左子树中的所有节点的值都比这个节点的值小

(2)某个节点的右子树中的所有节点的值都比这个节点的值大


下面有Go实现的非常详尽的代码,采用了Go风格的OO进行了封装。代码中主函数的例子的参照图如下:

这是我的二叉查找树的使用手册:

[cpp] view plain copy
  1. typeBiSearchTreestruct
  2. func(bst*BiSearchTree)Add(datafloat64)//插入节点
  3. func(bst*BiSearchTree)Delete(datafloat64)//删除节点
  4. func(bstBiSearchTree)GetRoot()*TreeNode//获取根节点
  5. func(bstBiSearchTree)IsEmpty()bool//检查树是否为空
  6. func(bstBiSearchTree)InOrderTravel()//中序遍历(也就是从小到大输出)
  7. func(bstBiSearchTree)Search(datafloat64)*TreeNode//查找节点
  8. func(bstBiSearchTree)GetDeepth()int//获取树的深度
  9. func(bstBiSearchTree)GetMin()float64//获取值最小的节点
  10. func(bstBiSearchTree)GetMax()float64//获取值最大的节点
  11. func(bstBiSearchTree)GetPredecessor(datafloat64)*TreeNode//获取直接前驱
  12. func(bstBiSearchTree)GetSuccessor(datafloat64)*TreeNode//获取直接后继
  13. func(bst*BiSearchTree)Clear()//清空树

实现代码:

[java] copy
    packagemain
  1. import(
  2. "fmt"
  3. )
  4. typeTreeNodestruct{
  5. datafloat64
  6. lchild*TreeNode
  7. rchild*TreeNode
  8. parent*TreeNode
  9. }
  10. typeBiSearchTreestruct{
  11. root*TreeNode
  12. cur*TreeNode
  13. create*TreeNode
  14. func(bst*BiSearchTree)Add(datafloat64){
  15. bst.create=new(TreeNode)
  16. bst.create.data=data
  17. if!bst.IsEmpty(){
  18. bst.cur=bst.root
  19. for{
  20. ifdata<bst.cur.data{
  21. //如果要插入的值比当前节点的值小,则当前节点指向当前节点的左孩子,如果
  22. //左孩子为空,就在这个左孩子上插入新值
  23. ifbst.cur.lchild==nil{
  24. bst.cur.lchild=bst.create
  25. bst.create.parent=bst.cur
  26. break
  27. }else{
  28. bst.cur=bst.cur.lchild
  29. elseifdata>bst.cur.data{
  30. //如果要插入的值比当前节点的值大,则当前节点指向当前节点的右孩子,如果
  31. //右孩子为空,就在这个右孩子上插入新值
  32. ifbst.cur.rchild==nil{
  33. bst.cur.rchild=bst.create
  34. bst.create.parent=bst.cur
  35. break
  36. }else{
  37. bst.cur=bst.cur.rchild
  38. }
  39. //如果要插入的值在树中已经存在,则退出
  40. return
  41. bst.root=bst.create
  42. bst.root.parent=nil
  43. func(bst*BiSearchTree)Delete(datafloat64){
  44. var(
  45. deleteNodefunc(node*TreeNode)
  46. node*TreeNode=bst.Search(data)
  47. deleteNode=func(node*TreeNode){
  48. ifnode==nil{
  49. ifnode.lchild==nil&&node.rchild==nil{
  50. //如果要删除的节点没有孩子,直接删掉它就可以(毫无挂念~.~!)
  51. ifnode==bst.root{
  52. bst.root=nil
  53. ifnode.parent.lchild==node{
  54. node.parent.lchild=nil
  55. node.parent.rchild=nil
  56. ifnode.lchild!=nil&&node.rchild==nil{
  57. //如果要删除的节点只有左孩子或右孩子,让这个节点的父节点指向它的指针指向它的
  58. //孩子即可
  59. ifnode==bst.root{
  60. node.lchild.parent=nil
  61. bst.root=node.lchild
  62. node.lchild.parent=node.parent
  63. ifnode.parent.lchild==node{
  64. node.parent.lchild=node.lchild
  65. node.parent.rchild=node.lchild
  66. ifnode.lchild==nil&&node.rchild!=nil{
  67. node.rchild.parent=nil
  68. bst.root=node.rchild
  69. node.rchild.parent=node.parent
  70. node.parent.lchild=node.rchild
  71. node.parent.rchild=node.rchild
  72. //如果要删除的节点既有左孩子又有右孩子,就把这个节点的直接后继的值赋给这个节
  73. //点,然后删除直接后继节点即可
  74. successor:=bst.GetSuccessor(node.data)
  75. node.data=successor.data
  76. deleteNode(successor)
  77. deleteNode(node)
  78. func(bstBiSearchTree)GetRoot()*TreeNode{
  79. ifbst.root!=nil{
  80. returnbst.root
  81. returnnil
  82. func(bstBiSearchTree)IsEmpty()bool{
  83. ifbst.root==nil{
  84. returntrue
  85. false
  86. func(bstBiSearchTree)InOrderTravel(){
  87. varinOrderTravelfunc(node*TreeNode)
  88. inOrderTravel=func(node*TreeNode){
  89. ifnode!=nil{
  90. inOrderTravel(node.lchild)
  91. fmt.Printf("%g",node.data)
  92. inOrderTravel(node.rchild)
  93. inOrderTravel(bst.root)
  94. func(bstBiSearchTree)Search(datafloat64)*TreeNode{
  95. //和Add操作类似,只要按照比当前节点小就往左孩子上拐,比当前节点大就往右孩子上拐的思路
  96. //一路找下去,知道找到要查找的值返回即可
  97. ifbst.cur==nil{
  98. bst.cur=bst.cur.lchild
  99. ifdata>bst.cur.data{
  100. returnbst.cur
  101. func(bstBiSearchTree)GetDeepth()int{
  102. vargetDeepthfunc(node*TreeNode)int
  103. getDeepth=func(node*TreeNode)int{
  104. ifnode==nil{
  105. return0
  106. 1
  107. var(
  108. ldeepthint=getDeepth(node.lchild)
  109. rdeepthint=getDeepth(node.rchild)
  110. )
  111. ifldeepth>rdeepth{
  112. returnldeepth+1
  113. returnrdeepth+returngetDeepth(bst.root)
  114. func(bstBiSearchTree)GetMin()float64{
  115. //根据二叉查找树的性质,树中最左边的节点就是值最小的节点
  116. ifbst.root==nil{
  117. return- bst.cur=bst.root
  118. for{
  119. ifbst.cur.lchild!=nil{
  120. returnbst.cur.data
  121. func(bstBiSearchTree)GetMax()float64{
  122. //根据二叉查找树的性质,树中最右边的节点就是值最大的节点
  123. ifbst.cur.rchild!=nil{
  124. returnbst.cur.data
  125. func(bstBiSearchTree)GetPredecessor(datafloat64)*TreeNode{
  126. getMax:=func(node*TreeNode)*TreeNode{
  127. ifnode.rchild!=nil{
  128. node=node.rchild
  129. returnnode
  130. node:=bst.Search(data)
  131. ifnode.lchild!=nil{
  132. //如果这个节点有左孩子,那么它的直接前驱就是它左子树的最右边的节点,因为比这
  133. //个节点值小的节点都在左子树,而这些节点中值最大的就是这个最右边的节点
  134. returngetMax(node.lchild)
  135. //如果这个节点没有左孩子,那么就沿着它的父节点找,知道某个父节点的父节点的右
  136. //孩子就是这个父节点,那么这个父节点的父节点就是直接前驱
  137. ifnode==nil||node.parent==nil{
  138. ifnode==node.parent.rchild{
  139. returnnode.parent
  140. node=node.parent
  141. func(bstBiSearchTree)GetSuccessor(datafloat64)*TreeNode{
  142. getMin:=func(node*TreeNode)*TreeNode{
  143. node=node.lchild
  144. //参照寻找直接前驱的函数对比着看
  145. node:=bst.Search(data)
  146. ifnode!=nil{
  147. ifnode.rchild!=nil{
  148. returngetMin(node.rchild)
  149. ifnode==nil||node.parent==nil{
  150. ifnode==node.parent.lchild{
  151. returnnode.parent
  152. node=node.parent
  153. returnnil
  154. func(bst*BiSearchTree)Clear(){
  155. bst.cur=nil
  156. bst.create=nil
  157. funcmain(){
  158. varbstBiSearchTree
  159. bst.Add(15)
  160. bst.Add(6)
  161. 18)
  162. 3)
  163. 7)
  164. 17)
  165. 20)
  166. 2)
  167. 4)
  168. 13)
  169. 9)
  170. 14)
  171. fmt.Printf("ThenodesoftheBiSearchTreeis:")
  172. bst.InOrderTravel()
  173. fmt.Printf("n")
  174. fmt.Printf("Thedeepthofthetreeis:%dn",bst.GetDeepth())
  175. fmt.Printf("Theminis:%gn",bst.GetMin())
  176. fmt.Printf("Themaxis:%gn",bst.GetMax())
  177. ifbst.Search(17)!=nil{
  178. fmt.Printf("The17exists.n")
  179. fmt.Printf("rootnode'spredecessoris:%gn",bst.GetPredecessor(bst.GetRoot().data).data)
  180. fmt.Printf("rootnode'ssuccessoris:%gn",bst.GetSuccessor(bst.GetRoot().data).data)
  181. bst.Delete(13)
  182. fmt.Printf("Nodesafterdeletethe13:")
  183. }


输出结果:

如果转载请注明出处:http://blog.csdn.net/gophers/article/details/23552925

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读