【剑指offer】重建二叉树

题目链接

牛客网


题目描述

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

pre:

12473568

in:

47215386

我们知道,前序遍历的第一个元素是二叉树的根,而且该元素将中序遍历序列分成的左右两部分分别是该元素的左右子树。根据此特性,我们可以递归构建二叉树。

比如上述序列中,前序序列的第一个元素为二叉树的根,中序序列中,元素 1 左边的元素(即 4,7,2)为其左子树的元素,元素 1 右边的元素(即5,3,8,6)为其右子树的元素,且中序遍历中 1 的 后三个元素正好是左子树元素,并且 1 的下一个元素 2 是其直接左孩子。剩下的都是 1 的右子树元素

左子树:

247

右子树:

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

public class Solution {

    public TreeNode reConstructBinaryTree(int [] pre, int [] in) {
        if (pre.length == 0 || in.length == 0)
            return null;
        return reConstructBinaryTree(pre, in, 0, pre.length - 1, 0, in.length - 1);
    }
    
    // 返回 以 preL 为根的子树
    private TreeNode reConstructBinaryTree(int[] pre, int[] in, int preL, int preR, int inL, int inR ) {
        if (preL > preR)
            return null;
        TreeNode node = new TreeNode(pre[preL]);
        int i = inL;
        // 找到中序遍历序列中 pre[pre[L]]的位置
        for (; i <= inR; i++) {
            if (in[i] == pre[preL])
                break;
        }
        
        int leftSize = i - inL; // 左子树元素 个数
        node.left = reConstructBinaryTree(pre, in, preL + 1, preL + leftSize, inL , i - 1);
        node.right = reConstructBinaryTree(pre, in, preL + leftSize + 1, preR, i + 1, inR);
        return node;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值