Python数据结构与算法——第二十一课 二叉排序树的深度优先遍历和广度优先遍历

  对于二叉排序树的遍历方式,有深度优先遍历广度优先遍历两种。深度优先遍历又有前序、中序、后序遍历三种类型,广度优先遍历就是按层遍历。下面分别介绍这两种遍历方式。

  (1)深度优先遍历:就是先找分支,向深里挖;再找层级,横向挖。深度优先遍历分为前序、中序、后序三种。前面在二叉排序树的遍历中使用了中序遍历,现把这三种遍历方式分别介绍如下:

  前序遍历也称为先根遍历,就是首先访问树的根节点,然后遍历左子树,最后遍历右子树。简称中右遍历。比如用于做目录结构的显示,先显示上级目录,再罗列下级目录,如下图所示。

 

  中序遍历在前面已介绍过,就是先访问树的左子树,然后访问树的根节点,最后访问右子树,简称左~右遍历。比如可以做表达式树,在编译器底层实现时用户可以实现基本的加、减、乘、除,实现先乘除后加减,如下图所示。

 

  后序遍历就是先访问树的左子节点,然后访问树的右子节点,最后访间根节点,简称左中遍历。比如删除操作,需要先删除所有子项,然后才能删除父级元素,如下图所示。

 

  (2)广度优先遍历:顾名思义,就是横向先遍历,也就是按树的深度层次遍历,从根节点往下,对每一层依此访问,在每一层中从左到右(也可从右到左)遍历,遍历完一层就进入下一层,直到没有节点,如下图所示。

 

  二叉排序树的前序遍历

  前序遍历也称为先根遍历,前序遍历首先访问根节点然后遍历左子树,最后遍历右子树。在遍历左子树、右子树时,仍然先访问子树父节点,然后遍历左子树,最后遍历右子树。若二叉排序树为空则结束返回,否则递归继续访问子树。需要注意:遍历左、右子树时仍然采用前序遍历方法,即中右模式遍历子树。二叉排序树的前序遍历的算法图解如下图所示。

 

  前序遍历调用不再写在节点类,换个方式,写到管理类中。

  程序代码:

 

 

  运行结果:

 

 

  练习1:把数组[33,53,9,2,7,88,7,15,1]输入二叉树中,并用前序遍历把它打印出来。

 

  二叉排序树的后序遍历

  后序遍历,也称为先子遍历。后序遍历首先遍历左子树,再遍历右子树,最后遍历根节点。在遍历左、右子树时,仍然先访问左子节点,然后访问右子节点,最后访问父节点。若二叉排序树为空则结束返回,否则继续进入子树按后序遍历原则递归遍历。

 

 

  运行结果:

 

 

  练习题2:把数组[33,53,9,2,7,88,7,15,1]输入二叉树中,并用后序遍历把它打印出来。

 

  二叉排序树的广度优先遍历

  前面学到的前序、中序、后序都是深度优先遍历,广度优先遍历则是按层次遍历,输出完上一层再输出下一层,直到最底层,如下图所示。

 

  程序实现思路:声明一个层节点列表和一个数据列表,首先把每层的节点放入层节点列表,然后把层节点列表中的数据放入数据列表,再把下一层的节点放入层节点列表。层层往复,直到最底层。

  程序代码:

 

 

  运行结果:

 

 

  练习题3:把数组[33,53,9,2,7,88,7,15,1]输入二叉树中,并用广度优先遍历把它打印出来。

 

  学思营编程课堂基于蓝桥STEM86平台https://www.stem86.com,开展学编程三部曲:

Scratch(三年级以前)>>>Python(四年级以后)>>>C++(七年级以后)教育实验活动,任何人可以免费参加,打开https://xuesiying.stem86.com网页注册进入课堂,也可关注本公众号留言。

更多课程请打开学思营同步网站:

http://www.5xstar.com/doc.html

 

参考资料:

1、《Python算法图解》何韬编著 清华大学出版社