Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【剑指Offer】:重建二叉树 #22

Open
littlejoyo opened this issue Mar 22, 2020 · 0 comments
Open

【剑指Offer】:重建二叉树 #22

littlejoyo opened this issue Mar 22, 2020 · 0 comments
Assignees
Labels
算法 算法题目解题归档

Comments

@littlejoyo
Copy link
Owner

littlejoyo commented Mar 22, 2020

个人博客:https://joyohub.com/

微信公众号:Joyo说

  • 《剑指offer》算法题目4

  • 关键词:树、二叉树

1.题目

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

二叉树的定义:

 public class TreeNode {
      int val;
      TreeNode left;
      TreeNode right;
      TreeNode(int x) { 
          val = x; 
    }
 }

2.解题思路

2.1 思路分析

根据中序遍历前序遍历可以确定二叉树,具体过程为:

1.根据前序序列第一个结点确定根结点
2.根据根结点在中序序列中的位置分割出左右两个子序列
3.对左子树和右子树分别递归使用同样的方法继续分解

例如:
前序序列{1,2,4,7,3,5,6,8} = pre
中序序列{4,7,2,1,5,3,8,6} = in

2.2 分解过程

1.根据当前前序序列的第一个结点确定根结点,为 1

2.找到 1 在中序遍历序列中的位置,为 in[3]

3.切割左右子树,则 in[3] 前面的为左子树, in[3] 后面的为右子树

4.所以切割后的左子树前序序列为:{2,4,7},切割后的左子树中序序列为:{4,7,2};

5.切割后的右子树前序序列为:{3,5,6,8},切割后的右子树中序序列为:{5,3,8,6}

6.对分割后的子树分别使用同样的方法分解,符合递归的思路。

2.3 实现代码

import java.util.Arrays;
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        if (pre.length == 0 || in.length == 0) {
            return null;
        }
        TreeNode root = new TreeNode(pre[0]);
        // 在中序中找到前序的根
        for (int i = 0; i < in.length; i++) {
            if (in[i] == pre[0]) {
                // 左子树,注意 copyOfRange 函数,左闭右开
                root.left = reConstructBinaryTree(Arrays.copyOfRange(pre, 1, i + 1), Arrays.copyOfRange(in, 0, i));
                // 右子树,注意 copyOfRange 函数,左闭右开
                root.right = reConstructBinaryTree(Arrays.copyOfRange(pre, i + 1, pre.length), Arrays.copyOfRange(in, i + 1, in.length));
                break;
            }
        }
        return root;
    }
}

注意:

  • copyOfRange函数的范围是:左闭右开,[a,b)

  • 区分好子树的分布范围,然后通过递归的思想来构建二叉树

2.4 复杂度

时间复杂度:O(n)
空间复杂度:O(n)

微信公众号

扫一扫关注Joyo说公众号,共同学习和研究开发技术。

weixin-a

@littlejoyo littlejoyo added the 算法 算法题目解题归档 label Mar 22, 2020
@littlejoyo littlejoyo self-assigned this Mar 22, 2020
@littlejoyo littlejoyo changed the title Coding:重建二叉树 【剑指Offer】:重建二叉树 Jun 13, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
算法 算法题目解题归档
Projects
None yet
Development

No branches or pull requests

1 participant