概念

首先我们要清楚基本概念,前、中、后序遍历中的前、中、后指代的是树的根、左节点、右节点之间的遍历顺序。
前序遍历:遍历顺序为根左右
中序遍历:遍历顺序为左根右
后序遍历:遍历顺序为左右根

那么对下图而言,前序遍历为UNI,中序遍历为NUI,后序遍历为NIU,观察这三种情况,可以发现前中后实际上指的是根的遍历顺序。
简单树

实例

假设给定如下所示一颗二叉搜索树,那么我们如何对其进行前序遍历、中序遍历以及后序遍历呢?
树的实例

前序遍历

前序遍历的遍历顺序是根左右。
我们首先从根节点U出发,由于它是根节点因此U排在首位,得到顺序U。
然后去找U的左节点,发现U没有左节点,于是去找U的右分支,得到顺序UI。
发现I有左节点I,得到顺序UII。
发现I有左节点N,得到顺序UIIN。
发现I有右节点S,得到顺序UIINS。
发现S有左节点R,得到顺序UIINSR。
发现R有左节点V,得到顺序UIINSRV。
发现R有右节点E,得到顺序UIINSRVE。
发现I有右节点T,得到顺序UIINSRVET。
发现I有右节点Y,得到顺序UIINSRVETY。
前序遍历从根节点出发,然后去找他的左节点,再找右节点,深度优先。

中序遍历

中序遍历的遍历顺序是左根右。
同样从根节点出发,由于根节点没有左节点,因此得到顺序U。
发现U有右节点I,但是I作为根节点,它有左节点I,因此它的左节点I,应该写在它的前面,继续往下看,I又有左节点N,因此左节点N应该写在根节点I之前,N没有左节点,因此得到顺序UN。
N的根节点是I,因此得到顺序UNI。
I的根节点是S,但是S有左节点R,因此R要写在S前面,同样的R作为根节点,有左节点V,因此得到顺序UNIV。
V的根节点是R,因此得到顺序UNIVR。
R的右节点为E,因此得到顺序UNIVRE。
R的根节点为S,因此得到顺序UNIVRES。
S的根节点为I,I已经遍历过,I的根节点为I,因此得到顺序UNIVRESI。
I的根节点也已经遍历过,得到顺序UNIVRESIT。
T的右节点为Y,得到顺序UNIVRESITY。
中序遍历从根节点出发,如果当前节点作为根节点有左节点,则先写左节点,然后再写自身,再写右侧节点,深度优先。

后序遍历

后序遍历的遍历顺序是左右根。
从根节点U出发,它有右侧节点I,因此I要写在U之前,I有左侧节点I,I有左侧节点N,因此得到顺序N。
N的根I有右节点S,但是S有左节点R,R又有左节点V,因此得到顺序NV。
V的根节点R有右节点E,因此得到顺序NVE。
左右节点都写完后,写根节点R,因此得到顺序NVER。
R的根节S没有右节点,因此得到顺序NVERS。
I的左右节点N和S都写完之后,写入I,得到顺序NVERSI。
I的左节点I写完后,写I的右节点T,但是I的右节点T有右节点Y,因此得到顺序NVERSIY。
得到顺序NVERSIYT。
得到顺序NVERSIYTI。
得到顺序NVERSIYTIU。
后序遍历同样是从根节点U出发,如果当前节点有左右节点,应该写完左右节点之后再写当前节点,同样是深度优先的思想。

构造树

前面在已知树的结构的情况下详细述说了如何得到树的前、中、后序遍历的遍历结果,当给出树的遍历结果时,我们也应该要能将这颗树完整地构造出来。假设已知树地前序遍历结果为UIINSRVETY,中序遍历结果为UNIVRESITY,尝试构造完整的二叉搜索树。
1 首先前序遍历的第一个元素U一定是树的根节点。
2 在中序遍历中,在U左侧的一定属于U的左子树,在U右侧的一定属于U的右子树。
3 前序遍历的第二个元素是I,且U没有左子树,可以先得到如下结构。
在这里插入图片描述
4 在中序遍历中,I左侧的元素属于I的左子树,I右侧的元素属于I的右子树,但是有两个I元素,假设中序遍历中第一个I为上图中U右侧的I,那么左侧只有一个元素N,那么会得到如下结构。那么他的前序遍历结构应该是UMI…,不满足题意,因此上图中的I,为中序遍历中第二个I,因此NIVRES为I左侧元素,TY为I右侧元素。
在这里插入图片描述
5 再看前序遍历中,下一个元素是I,且在中序遍历中I的左侧只有N,可得到如下结构。
在这里插入图片描述
6 VRES都属于I的右子树,前序遍历中,N后是S,可得到如下结构。
在这里插入图片描述
在中序遍历中,VRE均在S子树,TY在I的右子树,看前序遍历继续推到可以得到如下结构。
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐