kamacoder-solutions icon indicating copy to clipboard operation
kamacoder-solutions copied to clipboard

21.构造二叉树-使用cin进行输入数据会超时并出现潜在的数组或指针越界,而getline不会,请问一下为什么。

Open clannadbing opened this issue 1 year ago • 1 comments

#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;
}

clannadbing avatar Oct 11 '23 03:10 clannadbing

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,请教一下原因出在哪里呢

clannadbing avatar Oct 11 '23 03:10 clannadbing