输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
迭代法(没看懂)
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(!preorder.size()){ //判断是否为空
return nullptr;
}
TreeNode* root = new TreeNode(preorder[0]); //先序的首为根节点
stack<TreeNode*> stk; //建立栈
stk.push(root); //根节点入栈
int inorderIndex = 0; //扫描中序的指针
for(int i = 1; i < preorder.size(); i++){ //从先序遍历开始逐个遍历
TreeNode *node = stk.top();
if(node->val != inorder[inorderIndex]){ //栈顶元素的值与中序遍历当前所指的元素值不等
node->left = new TreeNode(preorder[i]); //前序遍历中处在栈顶元素位置后一位的元素是栈顶元素的左子树
stk.push(node->left); //栈顶元素左子树节点入栈
}else{ //栈顶元素的值与中序遍历当前所指的元素值相等,栈顶即为最左下角的树节点
while(!stk.empty() && stk.top()->val == inorder[inorderIndex]){ //while循环向上返回,寻找位置进行右子树的重建
node = stk.top(); //指针向右扫描中序遍历
stk.pop(); //栈中所有与当前指针所指元素值相等的节点出栈
inorderIndex++;
}
node->right = new TreeNode(preorder[i]); // 循环结束后,node所指栈顶元素即是需要重建右子树的节点
stk.push(node->right);
}
}
return root;
}
};
方法二
/**
* 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:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.empty()||inorder.empty()) return NULL;
int J=preorder[0];
TreeNode* root=new TreeNode(J);
int inRoot;
for (inRoot = 0;inRoot<inorder.size();inRoot++)
{
if(inorder[inRoot]==preorder[0])
{
break;
}
}
vector<int> inleft(inorder.begin(),inorder.begin()+inRoot);
vector<int> inright(inorder.begin()+inRoot+1,inorder.end());
vector<int> preleft(preorder.begin()+1,preorder.begin()+inleft.size()+1);
vector<int> preright(preorder.begin()+inleft.size()+1,preorder.end());
root->left=buildTree(inleft,preleft);
root->right=buildTree(preright,inright);
return root;
}
};
报错:terminate called after throwing an instance of 'std::length_error' what(): cannot create std::vector larger than max_size()
原因:
root->left=buildTree(inleft,preleft);
root->right=buildTree(preright,inright);