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); } }

浙公网安备 33010602011771号