python实现二叉查找树

http://lanqiu17.iteye.com/blog/2018525

 

这次用完成的是二叉树,是一种简单的树型结构。同样使用python实现 多的不说了,上代码吧。

Python代码 复制代码 收藏代码
  1. # -*- coding: cp936 -*-
  2. #---------------------------------------------
  3. #
  4. # author chile
  5. # version 1.0
  6. # date 2014-02-17
  7. # desc 二叉树
  8. #
  9. #
  10. #
  11. #---------------------------------------------
  12. class bintree:
  13. def __init__(self):
  14. self.root = None
  15. # 前驱节点
  16. def treePredecessor(self,entry):
  17. if entry.left != None:
  18. return self.maxTree(entry.left)
  19. preNode = entry.parent
  20. tempNode = entry
  21. while preNode != None and preNode.right.value != entry.value:
  22. tempNode = preNode
  23. preNode = preNode.parent
  24. return preNode
  25. #后继节点
  26. def treeSuccessor(self,entry):
  27. if entry.right != None:
  28. return self.minTree(entry.right)
  29. preNode = entry.parent
  30. tempNode = entry
  31. while preNode != None and preNode.left.value != entry.value:
  32. tempNode = preNode
  33. preNode = preNode.parent
  34. return preNode
  35. def add(self,value):
  36. tempNode = self.root
  37. parentNode = None
  38. entry = bintree.entry(value = value)
  39. while tempNode != None:
  40. parentNode = tempNode
  41. if cmp(value,parentNode.value) < 0:
  42. tempNode = tempNode.left
  43. else:
  44. tempNode = tempNode.right
  45. if parentNode == None:
  46. self.root = entry
  47. elif cmp(value,parentNode.value) < 0:
  48. parentNode.left = entry
  49. entry.parent = parentNode
  50. else:
  51. parentNode.right = entry
  52. entry.parent = parentNode
  53. #这里删除是全部删除节点(包括所有子节点)
  54. def remove(self,value):
  55. root = self.root
  56. parentNode = None
  57. if value == root.value:
  58. root.left = None
  59. root.right = None
  60. while root != None:
  61. parentNode = root.parent
  62. if value == root.value:
  63. root.left = None
  64. root.right = None
  65. if parentNode.left != None and parentNode.left.value == value:
  66. parentNode.left = None
  67. break
  68. else:
  69. parentNode.right = None
  70. break
  71. elif cmp(value,root.value) < 0:
  72. root = root.left
  73. else:
  74. root = root.right
  75. #查找节点
  76. def search(self,value):
  77. root = self.root
  78. while root != None and root.value != value:
  79. if cmp(value,root.value) < 0:
  80. root = root.left
  81. else:
  82. root = root.right
  83. return root
  84. #最小值的节点,其实就是找左边的叶子节点
  85. def minTree(self,root):
  86. entry = root
  87. while entry.left != None:
  88. entry = entry.left
  89. return entry
  90. #最大值的节点
  91. def maxTree(self,root):
  92. entry = root
  93. while entry.right != None:
  94. entry = entry.right
  95. return entry
  96. #中序遍历
  97. def iterator(self,root):
  98. if root != None:
  99. self.iterator(root.left)
  100. print root.value
  101. self.iterator(root.right)
  102. class entry:
  103. def __init__(self, value=None):
  104. self.left = None
  105. self.right = None
  106. self.parent = None
  107. self.value = value
  108. arr = [15,5,3,12,10,13,6,7,16,20,18,23]
  109. tree = bintree()
  110. for val in arr:
  111. tree.add(val)
  112. tree.iterator(tree.root)
  113. node = tree.search(16)
  114. print node.left , node.right , node.parent.value
  115. print tree.maxTree(node).value
  116. print tree.treePredecessor(node).value
  117. print tree.treeSuccessor(node).value
  118. #print tree.maxTree() , tree.minTree()
# -*- coding: cp936 -*-
#---------------------------------------------
#                                             
# author  chile                                   
# version  1.0                                
# date  2014-02-17                                       
# desc 二叉树                      
#                                             
#                                            
#                                            
#---------------------------------------------

class bintree:
    def __init__(self):
        self.root = None
        
    # 前驱节点
    def treePredecessor(self,entry):
        if entry.left != None:
            return self.maxTree(entry.left)
        preNode = entry.parent
        tempNode = entry
        while preNode != None and preNode.right.value != entry.value:
            tempNode = preNode
            preNode = preNode.parent
        return preNode
        
    
    #后继节点      
    def treeSuccessor(self,entry):
        if entry.right != None:
            return self.minTree(entry.right)
        preNode = entry.parent
        tempNode = entry
        while preNode != None and preNode.left.value != entry.value:
            tempNode = preNode
            preNode = preNode.parent
        return preNode
    
    def add(self,value):
        tempNode = self.root
        parentNode = None
        entry = bintree.entry(value = value)
        while tempNode != None:
            parentNode = tempNode
            if cmp(value,parentNode.value) < 0:
                tempNode = tempNode.left
            else:
                tempNode = tempNode.right
        if parentNode == None:
            self.root = entry
        elif cmp(value,parentNode.value) < 0:
            parentNode.left = entry
            entry.parent = parentNode
        else:
            parentNode.right = entry
            entry.parent = parentNode
    
    #这里删除是全部删除节点(包括所有子节点)
    def remove(self,value):
        root = self.root
        parentNode = None
        if value == root.value:
            root.left = None
            root.right = None
        while root != None:
            parentNode = root.parent
            if value == root.value:
                root.left = None
                root.right = None
                if parentNode.left != None and parentNode.left.value == value:
                    parentNode.left = None
                    break
                else:
                    parentNode.right = None
                    break
            elif cmp(value,root.value) < 0:
                root = root.left
            else:
                root = root.right
    
    #查找节点
    def search(self,value):
        root = self.root
        while root != None and root.value != value:
            if cmp(value,root.value) < 0:
                root = root.left
            else:
                root = root.right
        return root
    
    #最小值的节点,其实就是找左边的叶子节点
    def minTree(self,root):
        entry = root
        while entry.left != None:
            entry = entry.left
        return entry
    
    #最大值的节点
    def maxTree(self,root):
        entry = root
        while entry.right != None:
            entry = entry.right
        return entry
                
    
    #中序遍历
    def iterator(self,root):
        if root != None:
            self.iterator(root.left)
            print root.value
            self.iterator(root.right)
        
    
    class entry:
        def __init__(self, value=None):
            self.left = None
            self.right = None
            self.parent = None
            self.value = value
            
arr = [15,5,3,12,10,13,6,7,16,20,18,23]
tree = bintree()
for val in arr:
    tree.add(val)
 
tree.iterator(tree.root)
node = tree.search(16)
print node.left , node.right , node.parent.value
print tree.maxTree(node).value
print tree.treePredecessor(node).value
print tree.treeSuccessor(node).value
#print tree.maxTree() , tree.minTree()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值