前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >剑指offer第5题:重建二叉树

剑指offer第5题:重建二叉树

作者头像
鹏-程-万-里
发布2020-07-15 14:14:29
3310
发布2020-07-15 14:14:29
举报
文章被收录于专栏:Java小白成长之路

重建二叉树

剑指offer 07:重建二叉树

题目描述

解决思路

这道题要求我们根据中序遍历和前序遍历构建一颗二叉树。在前序遍历中,遍历顺序为根节点-->左节点-->右节点,中序遍历顺序为左节点-->根节点-->右节点,所以我们按照前序遍历的顺序进行遍历的时候,都可以将整个中序遍历序列分为左右子树,然后依次将左右孩子规划为根节点下面即可。小白在评论区里逛到一位同学画的流程图,小白就不自己画啦!链接在这里。

[https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/solution/er-cha-shu-de-qian-xu-bian-li-fen-zhi-si-xiang-by-/] 图片地址

流程图

根据这张流程图,我们可以对其进行实现。

在实现过程中,我们一般的套路是先将中序遍历使用map进行一个抽象,这样便于我们后面每次获取当前根节点在中序遍历中的索引位置,然后我们即可将中序遍历分为两个部分,分别构建左右子树节点。

代码实现

代码语言:javascript
复制
    HashMap<Integer,Integer> map = new HashMap<>();
    int preIndex = 0;//遍历前序遍历的索引值
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        for(int i = 0 ; i < inorder.length ; i++){//首先抽象出中序遍历
            map.put(inorder[i] , i);
        }
        return help(preorder , inorder , 0 , preorder.length - 1);
    }

    private TreeNode help(int[] preorder , int[] inorder , int start , int end){
        if(start > end) return null;
        int val = preorder[preIndex++];//获取头结点
        TreeNode node = new TreeNode(val);
        int midIndex = map.get(val);
        node.left = help(preorder , inorder , start , midIndex - 1);//构建左节点
        node.right = help(preorder , inorder , midIndex+1 , end);//构建右节点
        return node;
    }
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java小白成长之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 重建二叉树
    • 解决思路
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档