剑指 Offer 07. 重建二叉树

package leetcode;

import java.util.HashMap;

public class offer_07 {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        HashMap<Integer, Integer>map=new HashMap<Integer, Integer>();
        //存储中序遍历中节点的位置
        for(int i=0;i<inorder.length;i++) {
            map.put(inorder[i], i);
        }
        return build(preorder, inorder, 0, preorder.length-1, 0, preorder.length-1,map);
        
    }
    public TreeNode build(int[] preorder,int[] inorder,int preleft,int preright,int inleft,int inright,HashMap<Integer, Integer>map) {
        if(preleft>preright) {
            return null;
        }
        //先序遍历第一个节点即为根节点
        int preroot=preleft;
        //找出中序遍历中根节点的位置
        int inroot=map.get(preorder[preroot]);
        //新建一个节点
        TreeNode root=new TreeNode(preorder[preroot]);
        
        //左子树节点的数目
        int leftsize=inroot-inleft;
        //递归找出左子树的每一个根节点
        //下一个根节点是先序表中当前元素的下一个元素,结束位置是当前元素加上全部左子树,而中序遍历起始位置没有变
        root.left=build(preorder,inorder,preleft+1,preleft+leftsize,inleft,inroot-1,map);
        //递归找出右子树的每一个根节点
        //下一个根节点是先序表中当前元素加上全部左子树的下一个元素,结束位置是全部元素,中序遍历起始位置根节点元素的下一个位置到结束元素
        root.right=build(preorder,inorder,preleft+leftsize+1,preright,inroot+1,inright,map);
        
        
        return root;
    }

}

 

posted on 2022-03-21 15:31  一仟零一夜丶  阅读(20)  评论(0)    收藏  举报