解法:
使用递归重建左右子树即可。与输出二叉树右视图比较相似。
结束递归的条件为preStart > pre.size()或者vStart > vEnd;
左子树根节点在前序遍历pre中的位置为preStart = preStart + 1,全部左子树位于中序遍历vin[vStart:rootIdx-vin.begin()-1],其中rootIdx为根节点在中序遍历中的索引。右子树同理。
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { return constructBinaryTree(pre, 0, vin, 0, vin.size()); } TreeNode* constructBinaryTree(vector<int>& pre, int preStart, vector<int>& vin, int vStart, int vEnd) { if(preStart >= pre.size()) return NULL; if(vStart > vEnd) return NULL; TreeNode* root = new TreeNode(pre[preStart]); vector<int>::iterator rootIter = find( vin.begin()+vStart, vin.begin()+vEnd, pre[preStart] ); TreeNode* leftTree = constructBinaryTree( pre, preStart+1, vin, vStart, rootIter - vin.begin() - 1 ); TreeNode* rightTree = constructBinaryTree( pre, preStart+rootIter-(vin.begin()+vStart)+1, vin, rootIter-vin.begin()+1, vEnd); root->left = leftTree; root->right = rightTree; return root; } };