binarytree二叉树节点DFS深度优先搜索遍历,基于栈,非递归,python

x33g5p2x  于2021-11-17 转载在 Python  
字(1.9k)|赞(0)|评价(0)|浏览(389)

binarytree二叉树节点DFS深度优先搜索遍历,基于栈,非递归,python

注意对已经访问过的节点的处理,在while循环中,如果在栈回退时候,遇到之前访问过的节点,则直接弹出。弹出的情况还有一种就是该节点没有左右子节点了,表明到了尽头。

  1. import random
  2. from binarytree import build
  3. def app():
  4. data = []
  5. for i in range(8):
  6. data.append(i)
  7. random.shuffle(data)
  8. root = build(data)
  9. root.pprint(index=True, delimiter=',')
  10. nodes = my_travel_dfs(root)
  11. print('深度遍历', nodes)
  12. # 深度遍历,从左至右
  13. def my_travel_dfs(root):
  14. visit_path = []
  15. stack = [root[0]]
  16. while True:
  17. print('-----')
  18. if len(stack) == 0:
  19. break
  20. visit_node = stack[0]
  21. print('访问', visit_node.value)
  22. if visit_node in visit_path:
  23. print(visit_node.value, '已经访问')
  24. print('弹出', stack[0].value)
  25. del (stack[0])
  26. continue
  27. else:
  28. visit_path.append(visit_node)
  29. left_node = visit_node.left
  30. right_node = visit_node.right
  31. if right_node != None:
  32. stack.insert(0, right_node)
  33. if left_node != None:
  34. stack.insert(0, left_node)
  35. if left_node == None and right_node == None:
  36. print('弹出', stack[0].value)
  37. del (stack[0])
  38. print('stack', stack)
  39. print('search_path', visit_path)
  40. return visit_path
  41. if __name__ == '__main__':
  42. app()

输出:

  1. _____0,2_____
  2. / \
  3. _1,5_ _2,0_
  4. / \ / \
  5. _3,6 4,3 5,1 6,7
  6. /
  7. 7,4
  8. -----
  9. 访问 2
  10. stack [Node(5), Node(0), Node(2)]
  11. search_path [Node(2)]
  12. -----
  13. 访问 5
  14. stack [Node(6), Node(3), Node(5), Node(0), Node(2)]
  15. search_path [Node(2), Node(5)]
  16. -----
  17. 访问 6
  18. stack [Node(4), Node(6), Node(3), Node(5), Node(0), Node(2)]
  19. search_path [Node(2), Node(5), Node(6)]
  20. -----
  21. 访问 4
  22. 弹出 4
  23. stack [Node(6), Node(3), Node(5), Node(0), Node(2)]
  24. search_path [Node(2), Node(5), Node(6), Node(4)]
  25. -----
  26. 访问 6
  27. 6 已经访问
  28. 弹出 6
  29. -----
  30. 访问 3
  31. 弹出 3
  32. stack [Node(5), Node(0), Node(2)]
  33. search_path [Node(2), Node(5), Node(6), Node(4), Node(3)]
  34. -----
  35. 访问 5
  36. 5 已经访问
  37. 弹出 5
  38. -----
  39. 访问 0
  40. stack [Node(1), Node(7), Node(0), Node(2)]
  41. search_path [Node(2), Node(5), Node(6), Node(4), Node(3), Node(0)]
  42. -----
  43. 访问 1
  44. 弹出 1
  45. stack [Node(7), Node(0), Node(2)]
  46. search_path [Node(2), Node(5), Node(6), Node(4), Node(3), Node(0), Node(1)]
  47. -----
  48. 访问 7
  49. 弹出 7
  50. stack [Node(0), Node(2)]
  51. search_path [Node(2), Node(5), Node(6), Node(4), Node(3), Node(0), Node(1), Node(7)]
  52. -----
  53. 访问 0
  54. 0 已经访问
  55. 弹出 0
  56. -----
  57. 访问 2
  58. 2 已经访问
  59. 弹出 2
  60. -----
  61. 深度遍历 [Node(2), Node(5), Node(6), Node(4), Node(3), Node(0), Node(1), Node(7)]

相关文章