对于二叉排序树的遍历方式,有深度优先遍历和广度优先遍历两种。深度优先遍历又有前序、中序、后序遍历三种类型,广度优先遍历就是按层遍历。下面分别介绍这两种遍历方式。
(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算法图解》何韬编著 清华大学出版社