kamacoder-solutions
kamacoder-solutions copied to clipboard
21.构造二叉树-使用cin进行输入数据会超时并出现潜在的数组或指针越界,而getline不会,请问一下为什么。
#include<iostream>
#include<string>
using namespace std;
class Tree {
public:
Tree(char value) {
val = value;
}
char val;
Tree* leftTree = NULL;
Tree* rightTree = NULL;
};
Tree* GetBinnaryTree(string preorder, string midorder) {
if (preorder.size() == 0 || midorder.size() == 0) {
return NULL;
}
char value = preorder[0];
Tree* root = new Tree(value);
int index = 0;
while (midorder[index] != value) {
index++;
}
string left_midorder = "";
for (int i = 0; i < index; i++) {
left_midorder += midorder[i];
}
string right_midorder = "";
for (int i = index + 1; i < midorder.size(); i++) {
right_midorder += midorder[i];
}
string left_preorder = "";
for (int i = 1; i <= left_midorder.size(); i++) {
left_preorder += preorder[i];
}
string right_preorder = "";
for (int i = left_midorder.size() + 1; i < preorder.size(); i++) {
right_preorder += preorder[i];
}
root->leftTree = GetBinnaryTree(left_preorder, left_midorder);
root->rightTree = GetBinnaryTree(right_preorder, right_midorder);
return root;
}
void nextorder(Tree* root) {
if (root == NULL) {
return;
}
nextorder(root->leftTree);
nextorder(root->rightTree);
cout << root->val;
}
int main() {
while (true) {
string preorder, midorder;
cin >> preorder >> midorder;
Tree* root = GetBinnaryTree(preorder, midorder);
nextorder(root);
cout << endl;
}
return 0;
}
main函数改成如下形式就能在卡码网正常通过
int main() {
string s;
while (getline(cin, s)) { // 接受一整行字符串
string preorder = "", midorder = "";
// 拆分出两个字符串
int i;
for (i = 0; s[i] != ' '; i++) preorder += s[i];
i++;
for (; i < s.size(); i++) midorder += s[i];
Tree* root = GetBinnaryTree(preorder, midorder);
nextorder(root);
cout << endl;
}
return 0;
}
自己IDE跑是都可以的,卡码网编辑器中cin用时6s,而getline只用4ms,请教一下原因出在哪里呢