二叉树构造:从前序、中序与后序遍历序列入手
目录
引言
从前序与中序遍历序列构造二叉树(题目 105)
解题思路
举例说明
从中序与后序遍历序列构造二叉树(题目 106)
解题思路
举例说明
总结
引言
二叉树的遍历与构造是算法领域中的经典问题。LeetCode 上的“从前序与中序遍历序列构造二叉树”(题目 105)和“从中序与后序遍历序列构造二叉树”(题目 106),能帮助我们深入理解二叉树的特性。通过剖析这两道题,我们可以掌握利用不同遍历序列构建二叉树结构的方法。
从前序与中序遍历序列构造二叉树(题目 105)
解题思路
先序遍历的顺序是“根 - 左 - 右”,这意味着先序遍历的第一个元素必定是二叉树的根节点。而中序遍历的顺序是“左 - 根 - 右” 。我们可以这样构建二叉树:
1. 首先,从先序遍历序列中取出第一个元素,它就是当前子树的根节点。
2. 然后,在中序遍历序列中找到这个根节点。以这个根节点为界,它左边的元素构成了左子树的中序遍历序列,右边的元素构成了右子树的中序遍历序列。
3. 接着,根据中序遍历中左子树元素的个数,我们可以在先序遍历序列中确定左子树的先序遍历序列(从先序遍历的第二个元素开始,长度为左子树元素个数),剩下的部分就是右子树的先序遍历序列。
4. 最后,通过递归的方式,分别对左子树和右子树的遍历序列重复上述步骤,不断构建出完整的二叉树。
举例说明
假设先序遍历序列为 [3, 9, 20, 15, 7] ,中序遍历序列为 [9, 3, 15, 20, 7] 。先序遍历的第一个元素 3 是根节点。在中序遍历中找到 3 ,其左边的 [9] 是左子树中序遍历序列,右边的 [15, 20, 7] 是右子树中序遍历序列。左子树元素个数为 1 ,那么先序遍历中从第二个元素开始长度为 1 的 [9] 就是左子树先序遍历序列,剩下的 [20, 15, 7] 是右子树先序遍历序列。然后对左右子树的遍历序列递归操作,逐步构建二叉树。
从中序与后序遍历序列构造二叉树(题目 106)
解题思路
后序遍历的顺序是“左 - 右 - 根”,所以后序遍历的最后一个元素就是二叉树的根节点。结合中序遍历“左 - 根 - 右”的顺序,构建过程如下:
1. 取出后序遍历序列的最后一个元素,它是当前子树的根节点。
2. 在中序遍历序列里找到这个根节点。根节点左边的元素是左子树的中序遍历序列,右边的是右子树的中序遍历序列。
3. 根据中序遍历中左子树元素的数量,我们可以在后序遍历序列中确定左子树的后序遍历序列(从后序遍历序列起始位置开始,长度为左子树元素个数),右子树的后序遍历序列就是剩下的部分(不包含已经确定为根节点的那个元素) 。
4. 同样通过递归,对左子树和右子树的遍历序列进行上述操作,直至构造出整棵二叉树。
举例说明
若中序遍历序列是 [9, 3, 15, 20, 7] ,后序遍历序列是 [9, 15, 7, 20, 3] 。后序遍历的最后一个元素 3 是根节点。在中序遍历中找到 3 ,其左边 [9] 为左子树中序遍历序列,右边 [15, 20, 7] 为右子树中序遍历序列。左子树元素个数为 1 ,后序遍历中从起始位置开始长度为 1 的 [9] 是左子树后序遍历序列,剩下的 [15, 7, 20] 是右子树后序遍历序列。后续对左右子树递归构建。
总结
这两道题都是利用不同遍历序列的特性,通过确定根节点,划分左右子树遍历序列,再递归构建的方式来解决。理解了这些思路,不仅能轻松应对二叉树构造相关题目,还能加深对二叉树遍历本质的认识,为解决更复杂的树结构问题打下基础。