1. #! /usr/bin/env python
    2. #coding:utf-8
    3. class Node:
    4. """
    5. 二叉树左右枝
    6. """
    7. def __init__(self, data):
    8. """
    9. 节点结构
    10. """
    11. self.left = None
    12. self.right = None
    13. self.data = data
    14. def insert(self, data):
    15. """
    16. 插入节点数据
    17. """
    18. if data < self.data:
    19. if self.left is None:
    20. self.left = Node(data)
    21. else:
    22. self.left.insert(data)
    23. elif data > self.data:
    24. if self.right is None:
    25. self.right = Node(data)
    26. else:
    27. self.right.insert(data)
    28. def lookup(self, data, parent=None):
    29. """
    30. 遍历二叉树
    31. """
    32. if data < self.data:
    33. if self.left is None:
    34. return None, None
    35. return self.left.lookup(data, self)
    36. elif data > self.data:
    37. if self.right is None:
    38. return None, None
    39. return self.right.lookup(data, self)
    40. else:
    41. return self, parent
    42. def delete(self, data):
    43. """
    44. 删除节点
    45. """
    46. node, parent = self.lookup(data) #已有节点
    47. if node is not None:
    48. children_count = node.children_count() #判断子节点数
    49. if children_count == 0:
    50. # 如果该节点下没有子节点,即可删除
    51. if parent.left is node:
    52. parent.left = None
    53. else:
    54. parent.right = None
    55. del node
    56. elif children_count == 1:
    57. # 如果有一个子节点,则让子节点上移替换该节点(该节点消失)
    58. if node.left:
    59. n = node.left
    60. else:
    61. n = node.right
    62. if parent:
    63. if parent.left is node:
    64. parent.left = n
    65. else:
    66. parent.right = n
    67. del node
    68. else:
    69. # 如果有两个子节点,则要判断节点下所有叶子
    70. parent = node
    71. successor = node.right
    72. while successor.left:
    73. parent = successor
    74. successor = successor.left
    75. node.data = successor.data
    76. if parent.left == successor:
    77. parent.left = successor.right
    78. else:
    79. parent.right = successor.right
    80. def compare_trees(self, node):
    81. """
    82. 比较两棵树
    83. """
    84. if node is None:
    85. return False
    86. if self.data != node.data:
    87. return False
    88. res = True
    89. if self.left is None:
    90. if node.left:
    91. return False
    92. else:
    93. res = self.left.compare_trees(node.left)
    94. if res is False:
    95. return False
    96. if self.right is None:
    97. if node.right:
    98. return False
    99. else:
    100. res = self.right.compare_trees(node.right)
    101. return res
    102. def print_tree(self):
    103. """
    104. 按顺序打印数的内容
    105. """
    106. if self.left:
    107. self.left.print_tree()
    108. print self.data,
    109. if self.right:
    110. self.right.print_tree()
    111. def tree_data(self):
    112. """
    113. 二叉树数据结构
    114. """
    115. stack = []
    116. node = self
    117. while stack or node:
    118. if node:
    119. stack.append(node)
    120. node = node.left
    121. else:
    122. node = stack.pop()
    123. yield node.data
    124. node = node.right
    125. def children_count(self):
    126. """
    127. 子节点个数
    128. """
    129. cnt = 0
    130. if self.left:
    131. cnt += 1
    132. if self.right:
    133. cnt += 1
    134. return cnt