- 思路
先序遍历的顺序是根节点,左子树,右子树。中序遍历的顺序是左子树,根节点,右子树。
所以我们只需要根据先序遍历得到根节点,然后在中序遍历中找到根节点的位置,它的左边就是左子树的节点,右边就是右子树的节点。生成左子树和右子树就可以递归的进行了。
- 代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void buildTreetemp(TreeNode*& root, vector<int>& preorder, vector<int>& inorder, vector<int>::iterator first, vector<int>::iterator last){
if(first == last){
root = new TreeNode(*first);
return;
}
int size = preorder.size();
for(vector<int>::iterator ite = preorder.begin(); ite != preorder.end(); ite++){
vector<int>::iterator temp = find(first, last + 1, *ite);
if( temp != last + 1){
preorder.erase(ite); //不写这会超时
root = new TreeNode(*temp);
buildTreetemp(root -> left, preorder, inorder, first, temp - 1);
buildTreetemp(root -> right, preorder, inorder, temp + 1, last);
break;
}
}
return;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
TreeNode* root = nullptr;
if(inorder.size() != 0 && preorder.size() != 0)
{
buildTreetemp(root, preorder, inorder, inorder.begin(), inorder.end() - 1);
}
return root;
}
};