输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
思路:
前序遍历:[根,[根的左],[根的右]]
中序遍历:[[根的左],根,[根的右]]
我们需要根据前序遍历的根节点的值去定位到中序遍历中root的位置,
根据该位置以及中序遍历的右边界计算出root的左边的节点个数, 然后new一个root,通过递归给root->left和root->right赋值
递归函数的参数需要包含 前中序遍历 以及 前序遍历和中序遍历的左右边界:
递归结束条件: 左边界 > 有边界
class Solution {
unordered_map<int,int> mymap;
public:
TreeNode* recurseBuildTree(const vector<int>& preorder, const vector<int>& inorder, int preleft, int preright, int inleft, int inright) {
if(preleft > preright) return nullptr;
int preroot = preleft;
int inroot = mymap[preorder[preroot]];
int leftsize = inroot - inleft;
TreeNode* root = new TreeNode(preorder[preroot]);
root -> left = recurseBuildTree(preorder, inorder, preleft + 1, preleft + leftsize, inleft, inroot - 1);
root -> right = recurseBuildTree(preorder, inorder, preleft + leftsize + 1, preright, inroot + 1, inright);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n = preorder.size();
for(int i = 0; i < n; i++) {
mymap[inorder[i]] = i;
}
return recurseBuildTree(preorder, inorder, 0, n-1, 0, n-1);
}
};