105. 从前序与中序遍历序列构造二叉树

package leetcode;

import java.util.HashMap;

public class demo_105 {
    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 myBuildTree(preorder, inorder, 0, preorder.length-1, 0, inorder.length-1, map);
    }
    
    public TreeNode myBuildTree(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]);
        int lefttree=inroot-inleft;
        //创建出根节点
        TreeNode root=new TreeNode(preorder[preroot]);
        //创建出左子树
        root.left=myBuildTree(preorder, inorder, preleft+1, preleft+lefttree, inleft, inroot-1, map);
        //创建出右子树
        root.right=myBuildTree(preorder, inorder, preleft+lefttree+1 ,  preright, inroot+1 ,inright, map);
        return root;
    }
}

 

posted on 2022-05-07 15:23  一仟零一夜丶  阅读(12)  评论(0)    收藏  举报