重建二叉树

今天刷了一下二叉树的题,刷到了重建二叉树,题是这样的:

给出二叉树的先序和中序遍历序列,重建该二叉树。

一说到二叉树的题,我们都知道递归是用得最多的,比如二叉树的前中后序遍历,用递归特别简单易懂。所以碰到二叉树的题,我们可以先用递归思路思考下,果不其然,这道题递归同样也适用,接下来讲解一下递归的思想:

  1. 首先可以用list存储中序遍历数组的元素,用它存储的原因在于,后面可以查询下标;

  2. 第二步, 从前序遍历数组中取出第一个元素,我们都知道它是根结点,所以二叉树的根结点就找到了;记录此时根结点的索引index,设置前序数组索引pos,往后继续走;

  3. 开始递归过程,根结点的左子树就在区间list.subList(0,index),根结点的右子树的区间为list.subList(index+1,inorder.length)。

代码如下:

    public TreeNode buildTree1(int[] preorder, int[] inorder) {

        if (preorder.length == 0) {
            return null;
        }

        List<Integer> list = new ArrayList<>();
        for (int x:inorder){

            list.add(x);
        }
        return Helper(preorder,list);
    }

    int pos = 0;
    private TreeNode Helper(int[] preorder, List<Integer> list) {

        if (preorder.length == 0) {
            return null;
        }

        TreeNode root = new TreeNode(preorder[pos]);
        int index = list.indexOf(root.val);
        pos++;

        root.left = Helper(preorder,list.subList(0,index));
        root.right = Helper(preorder,list.subList(index+1,preorder.length));
        return root;

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值