二叉树(Binary Tree):是有限多个节点的集合,这个集合或者是空集,或者由一个根节点和两个互不相交的、分别称为左子树和右子树的二叉树组成。
二叉树最基本的操作是遍历,一般约定遍历时左节点优于右节点,这样根据节点的遍历顺序可以分为三种遍历操作:前序(中左右),先遍历根节点,再处理左右节点;中序(左中右),先遍历左节点然后处理根节点,最后处理右节点;后续(左右中),先遍历左右节点,然后再处理根节点。
从上边二叉树定义可以看出,二叉树使用了递归的概念,故,二叉树的很多操作可以很方便的通过递归来实现,当中也包括遍历操作,实际上三种遍历操作的递归实现是二叉树其他大多数操作实现的基础,绝大多数其他操作都可以在三种遍历中的一种基础上变化而来。
在已知两种遍历方式的前提下,求出第三种的遍历。
三种遍历方式的特征:
前序:起始是根节点
中序:根据根节点划分左右子树的遍历
后续:末尾的节点为根节点
几种类型的相互转换:
(1)已知前序、中序遍历,求后序遍历
前序遍历:GDAFEMHZ
中序遍历:ADEFGHMZ
第一步:根据前序遍历我们可以知道G为根节点。
第二步:根据中序遍历,根节点G左边的是左子树ADEF、根节点G右边的是右子树HMZ。
第三步:观察左子树ADEF,左子树的根节点肯定为总树的左子节点。在前序遍历中,总树的左子节点位于根节点G之后,所以左子树的根节点为D。
第四步:以此类推,右子树HMZ中找出右子节点,在前序遍历中右子树中第一个出现的M为右子树的根节点。
第五步:在左、右子树中都已经找出了根节点,可以重复第一步,直到所有的点都找全。
后序遍历的结果:AEFDHZMG
(2)已知中、后序遍历,求前序遍历
中序遍历:ADEFGHMZ
后序遍历:AEFDHZMG
第一步:根据后序遍历的尾结点G,可以确定总树的根节点为G。
第二步:根据中序遍历,总树根节点G的左子树为ADEF,右子树为HMZ。
第三步:总树的左子树ADEF在后序遍历中最后面的D节点,故,左子树ADEF的根节点为D,总树的右子树HMZ在后序遍历中最后面的M,故,右子树HMZ的根节点为M。
第四步:找出每个子树的根节点后重复重复第一步的动作,找出所有的节点位置。
前序遍历的结果:GDAFEMHZ
(3)已知前、后遍历,求中序遍历
前序遍历:GDAFEMHZ
后序遍历:AEFDHZMG
第一步:根据前序遍历首位节点或者后续遍历的末位节点确定总树的根节点。
第二步:我们发现了一个规律,前、后序遍历,去除根节点(成为了:前序遍历:DAFEMHZ;后序遍历:AEFDHZM),从左向右进行等长度切分,切分的两部都会符合第一步的规律,我们就确定了总树左子树和右子树的根节点:前序:DAFE|MHZ,后序:AEFD|HZM。
第三不:循环第一步的操作,知道所有节点都找出。
中序遍历的结果:ADEFGHMZ
引用
参考:
1、https://www.cnblogs.com/Franck/p/3792926.html
2、https://blog.csdn.net/m0_37698652/article/details/79218014