当前位置:Gxlcms > Python > Python实现二叉树结构与进行二叉树遍历的方法详解

Python实现二叉树结构与进行二叉树遍历的方法详解

时间:2021-07-01 10:21:17 帮助过:61人阅读

二叉树的建立

Python实现二叉树结构与进行二叉树遍历的方法详解

使用类的形式定义二叉树,可读性更好

  1. class BinaryTree:
  2. def __init__(self, root):
  3. self.key = root
  4. self.left_child = None
  5. self.right_child = None
  6. def insert_left(self, new_node):
  7. if self.left_child == None:
  8. self.left_child = BinaryTree(new_node)
  9. else:
  10. t = BinaryTree(new_node)
  11. t.left_child = self.left_child
  12. self.left_child = t
  13. def insert_right(self, new_node):
  14. if self.right_child == None:
  15. self.right_child = BinaryTree(new_node)
  16. else:
  17. t = BinaryTree(new_node)
  18. t.right_child = self.right_child
  19. self.right_child = t
  20. def get_right_child(self):
  21. return self.right_child
  22. def get_left_child(self):
  23. return self.left_child
  24. def set_root_val(self, obj):
  25. self.key = obj
  26. def get_root_val(self):
  27. return self.key
  28. r = BinaryTree('a')
  29. print(r.get_root_val())
  30. print(r.get_left_child())
  31. r.insert_left('b')
  32. print(r.get_left_child())
  33. print(r.get_left_child().get_root_val())
  34. r.insert_right('c')
  35. print(r.get_right_child())
  36. print(r.get_right_child().get_root_val())
  37. r.get_right_child().set_root_val('hello')
  38. print(r.get_right_child().get_root_val())

Python进行二叉树遍历

需求:
python代码实现二叉树的:
1. 前序遍历,打印出遍历结果
2. 中序遍历,打印出遍历结果
3. 后序遍历,打印出遍历结果
4. 按树的level遍历,打印出遍历结果
5. 结点的下一层如果没有子节点,以‘N'代替

方法:
使用defaultdict或者namedtuple表示二叉树
使用StringIO方法,遍历时写入结果,最后打印出结果
打印结点值时,如果为空,StringIO()写入‘N '
采用递归访问子节点
代码

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. # test tree as below:
  4. ''' 1 / \ / \ / \ / \ 2 3 / \ / \ / \ / \ 4 5 6 N / \ / \ / \ 7 N N N 8 9 / \ / \ / \ N N N N N N '''
  5. from collections import namedtuple
  6. from io import StringIO
  7. #define the node structure
  8. Node = namedtuple('Node', ['data', 'left', 'right'])
  9. #initialize the tree
  10. tree = Node(1,
  11. Node(2,
  12. Node(4,
  13. Node(7, None, None),
  14. None),
  15. Node(5, None, None)),
  16. Node(3,
  17. Node(6,
  18. Node(8, None, None),
  19. Node(9, None, None)),
  20. None))
  21. #read and write str in memory
  22. output = StringIO()
  23. #read the node and write the node's value
  24. #if node is None, substitute with 'N '
  25. def visitor(node):
  26. if node is not None:
  27. output.write('%i ' % node.data)
  28. else:
  29. output.write('N ')
  30. #traversal the tree with different order
  31. def traversal(node, order):
  32. if node is None:
  33. visitor(node)
  34. else:
  35. op = {
  36. 'N': lambda: visitor(node),
  37. 'L': lambda: traversal(node.left, order),
  38. 'R': lambda: traversal(node.right, order),
  39. }
  40. for x in order:
  41. op[x]()
  42. #traversal the tree level by level
  43. def traversal_level_by_level(node):
  44. if node is not None:
  45. current_level = [node]
  46. while current_level:
  47. next_level = list()
  48. for n in current_level:
  49. if type(n) is str:
  50. output.write('N ')
  51. else:
  52. output.write('%i ' % n.data)
  53. if n.left is not None:
  54. next_level.append(n.left)
  55. else:
  56. next_level.append('N')
  57. if n.right is not None:
  58. next_level.append(n.right)
  59. else:
  60. next_level.append('N ')
  61. output.write('\n')
  62. current_level = next_level
  63. if __name__ == '__main__':
  64. for order in ['NLR', 'LNR', 'LRN']:
  65. if order == 'NLR':
  66. output.write('this is preorder traversal:')
  67. traversal(tree, order)
  68. output.write('\n')
  69. elif order == 'LNR':
  70. output.write('this is inorder traversal:')
  71. traversal(tree, order)
  72. output.write('\n')
  73. else:
  74. output.write('this is postorder traversal:')
  75. traversal(tree, order)
  76. output.write('\n')
  77. output.write('traversal level by level as below:'+'\n')
  78. traversal_level_by_level(tree)
  79. print(output.getvalue())

更多Python实现二叉树结构与进行二叉树遍历的方法详解相关文章请关注PHP中文网!

人气教程排行