用前序遍历输出A和中序遍历输出B重建二叉树
关键点
现有 A[start1, end1] B[start2, end2]
end2-start2==end1-start1
A的第一个肯定是根节点,B找出根节点的index, B[start2, index-1]为左子树,B[index+1, end2]为右子树
A则是A[start1+1, start1+index-start2]为左子树,A[start1+index-start2+1, end1]为右子树
class Solution { public: TreeNode* helper(vector<int>& preorder, int start1, int end1, vector<int>& inorder, int start2, int end2){ if(start1>end1 || start2>end2) return NULL; TreeNode* p=new TreeNode(preorder[start1]); int idx=start2; for(int i=start2; i<=end2; ++i){ if(inorder[i]==preorder[start1]){ idx=i; break; } } p->left=helper(preorder, start1+1, idx+start1-start2, inorder, start2, idx-1); p->right=helper(preorder, idx+start1-start2+1, end1, inorder, idx+1, end2); return p; } TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { return helper(preorder, 0, preorder.size()-1, inorder, 0, inorder.size()-1); } };