题目
根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。例如,给出
前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3 / \ 9 20 / \ 15 7
Tag
二分查找。dfs.递归。
代码
0x0017F7D7 处有未经处理的异常(在 test.exe 中): 0xC00000FD: Stack overflow (参数: 0x00000001, 0x01242FBC)。
我的方法对于大数据的问题会栈溢出。
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if (preorder.empty() || inorder.empty())
return nullptr;
//root
TreeNode* root = new TreeNode(preorder[0]);
TreeNode* cur = root;
preorder.erase(preorder.begin());
auto it = inorder.begin();
for (; it != inorder.end(); it++)
{
if (root->val == *it)
{
break;
}
}//在inorder中找到根节点的迭代器
vector<int> leftin;
vector<int> rightin;
for (auto item = inorder.begin(); item<it; item++)
{
leftin.push_back(*item);
}
inorder.erase(inorder.begin(),it+1);
rightin = inorder;
root->left = buildTree(preorder, leftin);
root->right = buildTree(preorder, rightin);
return root;
}
};
正确解法
二分查找。递归。pre,in两个数组不变。参数 mid索引&,start起始距离,end终止距离。
注意数组越界判断。递归条件:mid>=pre.size || start>end
二分位置。pos= distance(.begin , find () ) 。其中find内部(.begin+start,.begin+end,pre[mid])。
递归下一个mid :mid++。左:(mid,start ,pos -1) 右:(mid,pos+1,end)。
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int midindx=0;
return helper(preorder,inorder,midindx,0,preorder.size()-1);//因为index是引用,所以要定义一个变量。不能直接传常量0进去,会报错
}
private:
TreeNode* helper(vector<int>& preorder,vector<int>& inorder,int& midIndex,int start,int end) {
//递归终止"index不能等于size(越界)。start不能超过end,可以等于
if(midIndex>=preorder.size()||start>end)
return nullptr;
TreeNode* root = new TreeNode(preorder[midIndex]);
auto pos = distance(inorder.begin(),find(inorder.begin()+start,inorder.begin()+end,preorder[midIndex]));
//find(.begin()+start,.begin()+end,pre[index]) 不能直接写.begin和.end,因为他们是会变的。
midIndex++;
root->left=helper(preorder,inorder,midIndex,start,pos-1);
root->right=helper(preorder,inorder,midIndex,pos+1,end);
return root;
}
};
问题
迭代