image.png
    树的遍历主要有两种,
    一种是深度优先遍历,像前序、中序、后序;
    另一种是广度优先遍历,像层次遍历。
    在树结构中两者的区别还不是非常明显,但从树扩展到有向图,到无向图的时候,深度优先搜索和广度优先搜索的效率和作用还是有很大不同的。
    深度优先一般用递归,广度优先一般用队列。一般情况下能用递归实现的算法大部分也能用堆栈来实现。
    Python实现功能:

    • 树的构造
    • 递归实现先序遍历、中序遍历、后序遍历
    • 堆栈实现先序遍历、中序遍历、后序遍历
    • 队列实现层次遍历
    1. class Node(object):
    2. """节点类"""
    3. def __init__(self, elem=-1, lchild=None, rchild=None):
    4. self.elem = elem
    5. self.lchild = lchild
    6. self.rchild = rchild
    7. class Tree(object):
    8. """树类"""
    9. def __init__(self):
    10. self.root = Node()
    11. self.myQueue = []
    12. def add(self, elem):
    13. """为树添加节点"""
    14. node = Node(elem)
    15. if self.root.elem == -1: # 如果树是空的,则对根节点赋值
    16. self.root = node
    17. self.myQueue.append(self.root)
    18. else:
    19. treeNode = self.myQueue[0] # 此结点的子树还没有齐。
    20. if treeNode.lchild == None:
    21. treeNode.lchild = node
    22. self.myQueue.append(treeNode.lchild)
    23. else:
    24. treeNode.rchild = node
    25. self.myQueue.append(treeNode.rchild)
    26. self.myQueue.pop(0) # 如果该结点存在右子树,将此结点丢弃。
    27. def front_digui(self, root):
    28. """利用递归实现树的先序遍历"""
    29. if root == None:
    30. return
    31. print(root.elem)
    32. self.front_digui(root.lchild)
    33. self.front_digui(root.rchild)
    34. def middle_digui(self, root):
    35. """利用递归实现树的中序遍历"""
    36. if root == None:
    37. return
    38. self.middle_digui(root.lchild)
    39. print(root.elem)
    40. self.middle_digui(root.rchild)
    41. def later_digui(self, root):
    42. """利用递归实现树的后序遍历"""
    43. if root == None:
    44. return
    45. self.later_digui(root.lchild)
    46. self.later_digui(root.rchild)
    47. print(root.elem)
    48. def front_stack(self, root):
    49. """利用堆栈实现树的先序遍历"""
    50. if root == None:
    51. return
    52. myStack = []
    53. node = root
    54. while node or myStack:
    55. while node: # 从根节点开始,一直找它的左子树
    56. print(node.elem)
    57. myStack.append(node)
    58. node = node.lchild
    59. node = myStack.pop() # while结束表示当前节点node为空,即前一个节点没有左子树了
    60. node = node.rchild # 开始查看它的右子树
    61. def middle_stack(self, root):
    62. """利用堆栈实现树的中序遍历"""
    63. if root == None:
    64. return
    65. myStack = []
    66. node = root
    67. while node or myStack:
    68. while node: # 从根节点开始,一直找它的左子树
    69. myStack.append(node)
    70. node = node.lchild
    71. node = myStack.pop() # while结束表示当前节点node为空,即前一个节点没有左子树了
    72. print(node.elem)
    73. node = node.rchild # 开始查看它的右子树
    74. def later_stack(self, root):
    75. """利用堆栈实现树的后序遍历"""
    76. if root == None:
    77. return
    78. myStack1 = []
    79. myStack2 = []
    80. node = root
    81. myStack1.append(node)
    82. while myStack1: # 这个while循环的功能是找出后序遍历的逆序,存在myStack2里面
    83. node = myStack1.pop()
    84. if node.lchild:
    85. myStack1.append(node.lchild)
    86. if node.rchild:
    87. myStack1.append(node.rchild)
    88. myStack2.append(node)
    89. while myStack2: # 将myStack2中的元素出栈,即为后序遍历次序
    90. print(myStack2.pop().elem)
    91. def level_queue(self, root):
    92. """利用队列实现树的层次遍历"""
    93. if root == None:
    94. return
    95. myQueue = []
    96. node = root
    97. myQueue.append(node)
    98. while myQueue:
    99. node = myQueue.pop(0)
    100. print(node.elem)
    101. if node.lchild != None:
    102. myQueue.append(node.lchild)
    103. if node.rchild != None:
    104. myQueue.append(node.rchild)
    105. if __name__ == '__main__':
    106. """主函数"""
    107. elems = range(10) # 生成十个数据作为树节点
    108. tree = Tree() # 新建一个树对象
    109. for elem in elems:
    110. tree.add(elem) # 逐个添加树的节点
    111. print('队列实现层次遍历:')
    112. tree.level_queue(tree.root)
    113. print('\n\n递归实现先序遍历:')
    114. tree.front_digui(tree.root)
    115. print('\n递归实现中序遍历:')
    116. tree.middle_digui(tree.root)
    117. print('\n递归实现后序遍历:')
    118. tree.later_digui(tree.root)
    119. print('\n\n堆栈实现先序遍历:')
    120. tree.front_stack(tree.root)
    121. print('\n堆栈实现中序遍历:')
    122. tree.middle_stack(tree.root)
    123. print('\n堆栈实现后序遍历:')
    124. tree.later_stack(tree.root)