剑指 Offer 07. 重建二叉树
重建二叉树
题目链接-来源:力扣(LeetCode)
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder =[3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:3
/
9 20
/
15 7
思路:
经典二叉树题。给出一个中序序列和一个前序(后序)序列,建树(注意只有前序、后序序列的话无法唯一地建立一棵二叉树)。此类问题只要想办法定位根节点即可。
对于本题,前序序列中的每一个节点,一定是后续子树的根节点,那么在中序序列中找到这个根节点,左侧即为左子树,右侧即为右子树。对每一个子树递归地重复这个建树过程即可。
注意到不管是前序、中序还是后序序列,一个子树当中的所有元素总是紧邻地出现在一起,那么我们只需要分别记录两个序列中该子树的起始元素的指针、末尾元素的指针,就能在两个序列中划定子树范围,从而递归地执行。
时间复杂度:O(n)
空间复杂度:O(n)
实现:
1 | class Solution { |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.