剑指 Offer 07.重建二叉树

题目

菜鸡刷题之路QAQ

思路

看到二叉树,首先要想到递归,那么我们来整理一下思路
前序遍历数组中,第一个数是根节点,,找到此节点在中序数组的位置,左边为左子树,右边为右子树,依次往下进行。


/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {

    static Map<Integer,Integer> mp ;
    static int [] preorder;

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        
        //两个数组的长度
        int preLen = preorder.length;
        int inLen = inorder.length;
		
		//备份前序遍历数组
        this.preorder = preorder;
		
		//用图来记住每个数据在中序数组中的下标
        mp = new HashMap<Integer,Integer>();

        for(int i=0;i<inLen;i++)
        {
            mp.put(inorder[i],i);
        }


        return buildTree(0,preLen-1,0,inLen-1);

       
    }

/**
     * 根据前序遍历数组的 [preL, preR] 和 中序遍历数组的 [inL, inR] 重新组建二叉树
     *
     * @param preL 前序遍历数组的区间左端点
     * @param preR 前序遍历数组的区间右端点
     * @param inL  中序遍历数组的区间左端点
     * @param inR  中序遍历数组的区间右端点
     * @return 构建的新二叉树的根结点
     */
    public static  TreeNode  buildTree(int preL,int preR,int inL,int inR)
    {

        if(preL>preR||inL>inR)
            return null;
		
		//前序遍历数组的第一个数
        int point = preorder[preL];
        //这前序数组的第一个数就是当前根节点    
        TreeNode root = new TreeNode(point);
		
		//获取根节点在中序遍历数组的下标,以便划分左右子树
        int pointIndex = mp.get(point);

        root.left = buildTree(preL + 1, preL + (pointIndex - inL), inL, pointIndex - 1);
        root.right = buildTree(preL + (pointIndex - inL) + 1, preR, pointIndex + 1, inR);
        return root;   
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值