二叉查找树是一种满足如下性质的二叉树:
(1) 某个节点的左子树中的所有节点的值都比这个节点的值小
(2)某个节点的右子树中的所有节点的值都比这个节点的值大
下面有Go实现的非常详尽的代码,采用了Go风格的OO进行了封装。代码中主函数的例子的参照图如下:
这是我的二叉查找树的使用手册:
- typeBiSearchTreestruct
- func(bst*BiSearchTree)Add(datafloat64)
- func(bst*BiSearchTree)Delete(datafloat64)
- func(bstBiSearchTree)GetRoot()*TreeNode
- func(bstBiSearchTree)IsEmpty()bool
- func(bstBiSearchTree)InOrderTravel()
- func(bstBiSearchTree)Search(datafloat64)*TreeNode
- func(bstBiSearchTree)GetDeepth()int
- func(bstBiSearchTree)GetMin()float64
- func(bstBiSearchTree)GetMax()float64
- func(bstBiSearchTree)GetPredecessor(datafloat64)*TreeNode
- func(bstBiSearchTree)GetSuccessor(datafloat64)*TreeNode
- func(bst*BiSearchTree)Clear()
实现代码:
packagemain
-
- import(
- "fmt"
- )
- typeTreeNodestruct{
- datafloat64
- lchild*TreeNode
- rchild*TreeNode
- parent*TreeNode
- }
-
- typeBiSearchTreestruct{
- root*TreeNode
- cur*TreeNode
- create*TreeNode
- func(bst*BiSearchTree)Add(datafloat64){
- bst.create=new(TreeNode)
- bst.create.data=data
- if!bst.IsEmpty(){
- bst.cur=bst.root
- for{
- ifdata<bst.cur.data{
-
-
- ifbst.cur.lchild==nil{
- bst.cur.lchild=bst.create
- bst.create.parent=bst.cur
- break
- }else{
- bst.cur=bst.cur.lchild
- elseifdata>bst.cur.data{
- //如果要插入的值比当前节点的值大,则当前节点指向当前节点的右孩子,如果
- //右孩子为空,就在这个右孩子上插入新值
- ifbst.cur.rchild==nil{
- bst.cur.rchild=bst.create
- bst.create.parent=bst.cur
- break
- }else{
- bst.cur=bst.cur.rchild
- }
- //如果要插入的值在树中已经存在,则退出
- return
- bst.root=bst.create
- bst.root.parent=nil
- func(bst*BiSearchTree)Delete(datafloat64){
- var(
- deleteNodefunc(node*TreeNode)
- node*TreeNode=bst.Search(data)
- deleteNode=func(node*TreeNode){
- ifnode==nil{
- ifnode.lchild==nil&&node.rchild==nil{
- //如果要删除的节点没有孩子,直接删掉它就可以(毫无挂念~.~!)
- ifnode==bst.root{
- bst.root=nil
- ifnode.parent.lchild==node{
- node.parent.lchild=nil
- node.parent.rchild=nil
- ifnode.lchild!=nil&&node.rchild==nil{
- //如果要删除的节点只有左孩子或右孩子,让这个节点的父节点指向它的指针指向它的
- //孩子即可
- ifnode==bst.root{
- node.lchild.parent=nil
- bst.root=node.lchild
- node.lchild.parent=node.parent
- ifnode.parent.lchild==node{
- node.parent.lchild=node.lchild
- node.parent.rchild=node.lchild
- ifnode.lchild==nil&&node.rchild!=nil{
- node.rchild.parent=nil
- bst.root=node.rchild
- node.rchild.parent=node.parent
- node.parent.lchild=node.rchild
- node.parent.rchild=node.rchild
- //如果要删除的节点既有左孩子又有右孩子,就把这个节点的直接后继的值赋给这个节
- //点,然后删除直接后继节点即可
- successor:=bst.GetSuccessor(node.data)
- node.data=successor.data
- deleteNode(successor)
- deleteNode(node)
- func(bstBiSearchTree)GetRoot()*TreeNode{
- ifbst.root!=nil{
- returnbst.root
- returnnil
- func(bstBiSearchTree)IsEmpty()bool{
- ifbst.root==nil{
- returntrue
- false
- func(bstBiSearchTree)InOrderTravel(){
- varinOrderTravelfunc(node*TreeNode)
- inOrderTravel=func(node*TreeNode){
- ifnode!=nil{
- inOrderTravel(node.lchild)
- fmt.Printf("%g",node.data)
- inOrderTravel(node.rchild)
- inOrderTravel(bst.root)
- func(bstBiSearchTree)Search(datafloat64)*TreeNode{
- //和Add操作类似,只要按照比当前节点小就往左孩子上拐,比当前节点大就往右孩子上拐的思路
- //一路找下去,知道找到要查找的值返回即可
- ifbst.cur==nil{
- bst.cur=bst.cur.lchild
- ifdata>bst.cur.data{
- returnbst.cur
- func(bstBiSearchTree)GetDeepth()int{
- vargetDeepthfunc(node*TreeNode)int
- getDeepth=func(node*TreeNode)int{
- ifnode==nil{
- return0
- 1
- var(
- ldeepthint=getDeepth(node.lchild)
- rdeepthint=getDeepth(node.rchild)
- )
- ifldeepth>rdeepth{
- returnldeepth+1
- returnrdeepth+returngetDeepth(bst.root)
- func(bstBiSearchTree)GetMin()float64{
- //根据二叉查找树的性质,树中最左边的节点就是值最小的节点
- ifbst.root==nil{
- return- bst.cur=bst.root
- for{
- ifbst.cur.lchild!=nil{
- returnbst.cur.data
- func(bstBiSearchTree)GetMax()float64{
- //根据二叉查找树的性质,树中最右边的节点就是值最大的节点
- ifbst.cur.rchild!=nil{
- returnbst.cur.data
- func(bstBiSearchTree)GetPredecessor(datafloat64)*TreeNode{
- getMax:=func(node*TreeNode)*TreeNode{
- ifnode.rchild!=nil{
- node=node.rchild
- returnnode
- node:=bst.Search(data)
- ifnode.lchild!=nil{
- //如果这个节点有左孩子,那么它的直接前驱就是它左子树的最右边的节点,因为比这
- //个节点值小的节点都在左子树,而这些节点中值最大的就是这个最右边的节点
- returngetMax(node.lchild)
- //如果这个节点没有左孩子,那么就沿着它的父节点找,知道某个父节点的父节点的右
- //孩子就是这个父节点,那么这个父节点的父节点就是直接前驱
- ifnode==nil||node.parent==nil{
- ifnode==node.parent.rchild{
- returnnode.parent
- node=node.parent
- func(bstBiSearchTree)GetSuccessor(datafloat64)*TreeNode{
- getMin:=func(node*TreeNode)*TreeNode{
- node=node.lchild
- //参照寻找直接前驱的函数对比着看
- node:=bst.Search(data)
- ifnode!=nil{
- ifnode.rchild!=nil{
- returngetMin(node.rchild)
- ifnode==nil||node.parent==nil{
- ifnode==node.parent.lchild{
- returnnode.parent
- node=node.parent
- returnnil
- func(bst*BiSearchTree)Clear(){
- bst.cur=nil
- bst.create=nil
- funcmain(){
- varbstBiSearchTree
- bst.Add(15)
- bst.Add(6)
- 18)
- 3)
- 7)
- 17)
- 20)
- 2)
- 4)
- 13)
- 9)
- 14)
- fmt.Printf("ThenodesoftheBiSearchTreeis:")
- bst.InOrderTravel()
- fmt.Printf("n")
- fmt.Printf("Thedeepthofthetreeis:%dn",bst.GetDeepth())
- fmt.Printf("Theminis:%gn",bst.GetMin())
- fmt.Printf("Themaxis:%gn",bst.GetMax())
- ifbst.Search(17)!=nil{
- fmt.Printf("The17exists.n")
- fmt.Printf("rootnode'spredecessoris:%gn",bst.GetPredecessor(bst.GetRoot().data).data)
- fmt.Printf("rootnode'ssuccessoris:%gn",bst.GetSuccessor(bst.GetRoot().data).data)
- bst.Delete(13)
- fmt.Printf("Nodesafterdeletethe13:")
- }
输出结果:
如果转载请注明出处:http://blog.csdn.net/gophers/article/details/23552925 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|