在经典二叉树问题中,还有一类题目,那就是给定深度优先遍历序列三种顺序中的两种,反推一棵二叉树的结构图。实际上这种问题具有很强的技巧性,只要我们记住这一技巧,就能够很容易的推断出整个二叉树的结构。
请记住如下规律:中序定左右,树根看先后
但是需要注意的是:在给定的深度优先遍历序列的两种序列中,只有包含中序遍历序列的情况下,才能唯一确定一个二叉树的结构

1、先序序列+中序序列的逆推过程

通过先序序列和中序序列逆推二叉树的步骤如下:

  • 步骤1:在先序序列中最先出现的节点就是整个二叉树的根节点;
  • 步骤2:在中序序列中找到根节点的位置,根节点左边的所有节点就是树根左子树的构成,根节点右边的所有节点就是树根右子树 的构成;
  • 步骤3:使用中序序列的左子树部分,在先序序列中进行查找,在先序序列中最先出现的节点就是左子树的树根;
  • 步骤4:使用中序序列的右子树部分,在先序序列中进行查找,在先序序列中最先出现的节点就是右子树的树根;
  • 步骤5:确定左右子树的树根节点之后,重复步骤1-­5,直到先序序列和中序序列中的所有元素全部使用过为止,二叉树构建完成。

通过先序序列和中序序列构建二叉树过程如图所示:

java 反转二叉树 二叉树逆转_中序

2、后序序列+中序序列的逆推过程

通过后序序列和中序序列逆推二叉树结构的方式和前面的通过先序序列和中序序列逆推二叉树结构的过程基本相似,只是现在确定子树树根节点的方式变成了:在后序序列中,最后出现的节点才是整个二叉树或者左右子树的树根节点。
通过后序序列和中序序列逆推二叉树的步骤如下:

  • 步骤1:在后序序列中最后出现的节点是整个二叉树结构的根节点
  • 步骤2:在中序序列中找到根节点的位置,根节点左边的所有节点就是树根左子树的构成,根节点右边的所有节点就是树根右子树的构成
  • 步骤3:使用中序序列的左子树部分,在后序序列中进行查找,在后序序列中最后出现的节点就是左子树的树根
  • 步骤4:使用中序序列的右子树部分,在后序序列中进行查找,在后序序列中最后出现的节点就是右子树的树根
  • 在确定左右子树的树根节点之后,重复上述步骤1-­5,直到后序序列和中序序列中的所有元素全部使用过为止,二叉树构建完成

通过后序序列和中序序列构建二叉树过程如图所示:

java 反转二叉树 二叉树逆转_子树_02

3、二叉树的镜像对称问题

为什么说在之给定先序序列和后序序列的情况下不能够唯一确定一个二叉树的结构呢?下面我们先来观察如下的两个二叉树结构,并对这两个二叉树结构分别推断先序、中序、后序遍历序列:

java 反转二叉树 二叉树逆转_二叉树_03

从上图中我们不难看出,两个二叉树的结构是不同的,但是两个二叉树的先序序列和后序序列是完全相同的,只有中序序列不同
我们称图中两个二叉树结构下BD两个节点的结构为镜像对称。所以,如果在两个二叉树结构中存在这种进行对称的结构,是不能够通过先序序列和后序序列进行区分的,只能够再通过一个中序序列加以区分。