经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
python3实现二叉树的遍历与递归算法解析(小结)
来源:jb51  时间:2019/7/4 8:34:11  对本文有异议

1、二叉树的三种遍历方式

二叉树有三种遍历方式:先序遍历,中序遍历,后续遍历 即:先中后指的是访问根节点的顺序 eg:先序 根左右 中序 左根右 后序 左右根

遍历总体思路:将树分成最小的子树,然后按照顺序输出

1.1 先序遍历

    a 先访问根节点

    b 访问左节点

    c 访问右节点

    a(b ( d ( h ) )( e ( i ) ))( c ( f )( g )) -- abdheicfg

1.2 中序遍历

    a 先访问左节点

    b 访问根节点

    c 访问右节点

    ( ( ( h ) d ) b ( ( i ) e ) ) a ( ( f ) c ( g ) ) -- hdbieafcg

1.3后序遍历

    a 先访问左节点

    b 访问右节点

    c 访问根节点

    ((hd)(ie)b)(fgc)a -- hdiebfgca

2、python3实现树结构

  1. #实现树结构的类,树的节点有三个私有属性 左指针 右指针 自身的值
  2. class Node():
  3.  
  4. def __init__(self,data=None):
  5. self._data = data
  6. self._left = None
  7. self._right = None
  8.  
  9. def set_data(self,data):
  10. self._data = data
  11.  
  12. def get_data(self):
  13. return self._data
  14.  
  15. def set_left(self,node):
  16. self._left = node
  17.  
  18. def get_left(self):
  19. return self._left
  20.  
  21. def set_right(self,node):
  22. self._right = node
  23.  
  24. def get_right(self):
  25. return self._right
  26.  
  27. if __name__ == '__main__':
  28. #实例化根节点
  29. root_node = Node('a')
  30. # root_node.set_data('a')
  31. #实例化左子节点
  32. left_node = Node('b')
  33. #实例化右子节点
  34. right_node = Node('c')
  35. #给根节点的左指针赋值,使其指向左子节点
  36. root_node.set_left(left_node)
  37. #给根节点的右指针赋值,使其指向右子节点
  38. root_node.set_right(right_node)
  39.  
  40. print(root_node.get_data(),root_node.get_left().get_data(),root_node.get_right().get_data())

3、实现树的递归遍历(前 中 后 层次遍历)

下例是树的遍历算法,其中对树的类进行了优化,

  1. #实现树结构的类,树的节点有三个私有属性 左指针 右指针 自己的值
  2. class Node():
  3.  
  4. def __init__(self,data =None,left=None,right = None):
  5. self._data = data
  6. self._left = left
  7. self._right = right
  8.  
  9.  
  10. #先序遍历 遍历过程 根左右
  11. def pro_order(tree):
  12. if tree == None:
  13. return False
  14. print(tree._data)
  15. pro_order(tree._left)
  16. pro_order(tree._right)
  17.  
  18. #后序遍历
  19. def pos_order(tree):
  20. if tree == None:
  21. return False
  22. # print(tree.get_data())
  23. pos_order(tree._left)
  24. pos_order(tree._right)
  25. print(tree._data)
  26.  
  27. #中序遍历
  28. def mid_order(tree):
  29. if tree == None:
  30. return False
  31. # print(tree.get_data())
  32. mid_order(tree._left)
  33. print(tree._data)
  34. mid_order(tree._right)
  35.  
  36.  
  37. #层次遍历
  38. def row_order(tree):
  39. # print(tree._data)
  40. queue = []
  41. queue.append(tree)
  42. while True:
  43. if queue==[]:
  44. break
  45. print(queue[0]._data)
  46. first_tree = queue[0]
  47. if first_tree._left != None:
  48. queue.append(first_tree._left)
  49. if first_tree._right != None:
  50. queue.append(first_tree._right)
  51. queue.remove(first_tree)
  52.  
  53. if __name__ == '__main__':
  54.  
  55. tree = Node('A',Node('B',Node('D'),Node('E')),Node('C',Node('F'),Node('G')))
  56. pro_order(tree)
  57. mid_order(tree)
  58. pos_order(tree)

4、递归算法

上面两张图片是从知乎贴过来的;图1中返回后会直接返回到上一级的返回,这种想法是不全面的,较合理的返回应该是如图2 在子函数返回时应返回到调用子函数的节点,这样在执行完剩余代码再返回到上一级

如果是按照图1返回的话二叉树的遍历就不能按照上例来实现。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持w3xue。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号