p107 用前序和中序遍历序列构建二叉树(leetcode 105)

一:解题思路

利用一个辅助哈希表来存储,中序遍历的元素和对于的下标。Time:O(n),Space:O(n)

二:完整代码示例 (C++版和Java版)

C++:

class Solution 
{
private:
    TreeNode* buildTree(vector<int>& preorder, int preStart, int preEnd, int inStart, map<int, int>& inPos)
    {
        if (preStart > preEnd) return NULL;
        TreeNode* root = new TreeNode(preorder[preStart]);
        int rootIdx = inPos[preorder[preStart]];
        int leftLen = rootIdx - inStart;
        root->left = buildTree(preorder,preStart+1,preStart+leftLen,inStart,inPos);
        root->right = buildTree(preorder,preStart+leftLen+1,preEnd,rootIdx+1,inPos);

        return root;
    }
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 
    {
        map<int, int> inPos;
        for (int i = 0; i < inorder.size(); i++)
            inPos[inorder[i]] = i;

        return buildTree(preorder,0,preorder.size()-1,0,inPos);
    }
};

Java:

class Solution 
    {
        private TreeNode buildTree(int[] preorder,int preStart,int preEnd,int inStart,Map<Integer,Integer> inPos)
        {
            if(preStart>preEnd) return null;
            TreeNode root=new TreeNode(preorder[preStart]);
            int rootIdx=inPos.get(preorder[preStart]);
            int leftLen=rootIdx-inStart;
            root.left=buildTree(preorder,preStart+1,preStart+leftLen,inStart,inPos);
            root.right=buildTree(preorder,preStart+leftLen+1,preEnd,rootIdx+1,inPos);
            
            return root;
        }
        
        public TreeNode buildTree(int[] preorder, int[] inorder) 
        {
               Map<Integer,Integer> inPos=new HashMap<>();
               for(int i=0;i<inorder.length;i++)
                   inPos.put(inorder[i],i);
               
               return buildTree(preorder,0,preorder.length-1,0,inPos);
        }
    }

 

posted @ 2020-04-08 21:25  repinkply  阅读(123)  评论(0)    收藏  举报