剑指Offer-二叉树-重建二叉树

07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
在这里插入图片描述
解题思路:

  • 前序遍历特点: 节点按照 [ 根节点 | 左子树 | 右子树 ] 排序,以题目示例为例:[ 3 | 9 | 20 15 7 ]
    中序遍历特点: 节点按照 [ 左子树 | 根节点 | 右子树 ] 排序,以题目示例为例:[ 9 | 3 | 15 20 7 ]
    根据题目描述输入的前序遍历和中序遍历的结果中都不含重复的数字,其表明树中每个节点值都是唯一的。

  • 根据以上特点,可以按顺序完成以下工作:
    前序遍历的首个元素即为根节点 root 的值;
    在中序遍历中搜索根节点 root 的索引 ,可将中序遍历划分为 [ 左子树 | 根节点 | 右子树 ] 。
    根据中序遍历中的左(右)子树的节点数量,可将前序遍历划分为 [ 根节点 | 左子树 | 右子树 ]

  • 自此可确定 三个节点的关系 :1.树的根节点、2.左子树根节点、3.右子树根节点(即前序遍历中左(右)子树的首个元素)。
    子树特点: 子树的前序和中序遍历仍符合以上特点,以题目示例的右子树为例:前序遍历[20 | 15 | 7],中序遍历 [ 15 | 20 | 7 ] 。
    根据子树特点,我们可以通过同样的方法对左(右)子树进行划分,每轮可确认三个节点的关系 。此递推性质让我们联想到用 递归方法处理。

递归解析:

发布了44 篇原创文章 · 获赞 3 · 访问量 2586

猜你喜欢

转载自blog.csdn.net/xfxlesson/article/details/104613680