博客
关于我
剑指 Offer 07. 重建二叉树
阅读量:85 次
发布时间:2019-02-26

本文共 1366 字,大约阅读时间需要 4 分钟。

问题描述

输入某二叉树的前序遍历和中序遍历结果,请重建该二叉树。假设输入的前序遍历和中序遍历结果中都不含重复的数字。例如,给出前序遍历 preorder = [3,9,20,15,7] 和中序遍历 inorder = [9,3,15,20,7],返回如下的二叉树:

3   / \  9   20     / \    15  7

解决思路

树的相关问题通常可以考虑使用递归的方法来解决。递归法通过分治的思想,逐步划分子树,直到找到单个节点为止。

具体来说,我们可以采用以下步骤来重建二叉树:

  • 首先,建立一个映射表,将中序遍历中的节点值与其位置存储起来。这样可以快速找到某个节点在中序遍历中的位置。

  • 然后,通过递归的方式,从前序遍历和中序遍历中依次找到子树的根节点及其左右子树的范围。具体来说:

    • 根节点的值在前序遍历中位于当前范围内的第一个位置。
    • 根节点的位置在中序遍历中确定后,左子树的范围是从左边界到根节点左边的位置,右子树的范围是从根节点右边的位置到右边界。
  • 递归地重建左子树和右子树,直到所有节点都被处理完毕。

  • 代码实现

    import java.util.HashMap;import java.util.Map;class Solution {    Map
    map = new HashMap<>(); int[] preorder; public TreeNode buildTree(int[] preorder, int[] inorder) { this.preorder = preorder; for (int i = 0; i < inorder.length; i++) { map.put(inorder[i], i); } return trackck(0, 0, preorder.length - 1); } public TreeNode trackck(int rootPreIndex, int inorderLeft, int inorderRight) { if (inorderLeft > inorderRight) { return null; } TreeNode root = new TreeNode(preorder[rootPreIndex]); int rootInIndex = map.get(preorder[rootPreIndex]); root.left = trackck(rootPreIndex + 1, inorderLeft, rootInIndex - 1); root.right = trackck(rootPreIndex + (rootInIndex - inorderLeft + 1), rootInIndex + 1, inorderRight); return root; }}

    这个方法的核心思想是利用前序遍历和中序遍历的特点,通过递归的方式分割子树,最终重建出原来的二叉树。

    转载地址:http://wxsu.baihongyu.com/

    你可能感兴趣的文章
    opencv waitKey() 函数理解及应用
    查看>>
    OpenCV 中的图像转换
    查看>>
    OpenCV 人脸识别 C++实例代码
    查看>>
    OpenCV 在 Linux 上的 python 与 anaconda 无法正常工作.收到未实现 cv2.imshow() 的错误
    查看>>
    Opencv 完美配置攻略 2014 (Win8.1 + Opencv 2.4.8 + VS 2013)上
    查看>>
    opencv 模板匹配, 已解决模板过大程序不工作的bug
    查看>>
    OpenCV 错误:(-215)size.width>0 &&函数imshow中的size.height>0
    查看>>
    opencv&Python——多种边缘检测
    查看>>
    opencv&python——高通滤波器和低通滤波器
    查看>>
    OpenCV+Python识别车牌和字符分割的实现
    查看>>
    OpenCV-Python接口、cv和cv2的性能比较
    查看>>
    OpenCV/Python/dlib眨眼检测
    查看>>
    opencv1-加载、修改、保存图像
    查看>>
    opencv10-形态学操作
    查看>>
    opencv11-提取水平直线和垂直直线
    查看>>
    opencv12-图像金字塔
    查看>>
    opencv13-基本阈值操作
    查看>>
    opencv14-自定义线性滤波
    查看>>
    opencv15-边缘处理
    查看>>
    opencv16-Sobel算子
    查看>>