lwjppz 2019-02-16 16:51 采纳率: 0%
浏览 775

为什么在VS2017上能正常运行而在OJ上面就Runtime Error:Segmentation fault呢?求助!!!

#include<iostream>
#include<iomanip>
#include<string>
#include<queue>
#include<vector>
#include<stdlib.h>
using namespace std;
template<typename T>
class TreeNode {
public:
    T data;
    TreeNode<T> *leftChild;
    TreeNode<T> *rightChild;
    TreeNode(T data) {
        this->data = data;
        this->rightChild = NULL;
        this->rightChild = NULL;
    }
};
template<typename T>
class BinaryTree {
private:
    TreeNode<T> *root;
public:
    BinaryTree(T data);
    TreeNode<T>* getroot();
    void InsertLeft(TreeNode<T> *p, T data);
    void InsertRight(TreeNode<T> *p, T data);
    TreeNode<T>* Search(TreeNode<T> *root, T data);
    void PreOrder(TreeNode<T> *root);
    void InOrder(TreeNode<T> *root);
    void PostOrder(TreeNode<T> *root);
};
template<typename T>
BinaryTree<T>::BinaryTree(T data) {
    TreeNode<T> *newnode = new TreeNode<T>(data);
    root = newnode;
}
template<typename T>
TreeNode<T>* BinaryTree<T>::getroot() {
    return root;
}
template<typename T>
void BinaryTree<T>::InsertLeft(TreeNode<T> *p, T data) {
    TreeNode<T> *newnode = new TreeNode<T>(data);
    newnode->leftChild = p->leftChild;
    p->leftChild = newnode;
}
template<typename T>
void BinaryTree<T>::InsertRight(TreeNode<T> *p, T data) {
    TreeNode<T> *newnode = new TreeNode<T>(data);
    newnode->rightChild = p->rightChild;
    p->rightChild = newnode;
}
template<typename T>
TreeNode<T>* BinaryTree<T>::Search(TreeNode<T> *root, T data) {
    queue<TreeNode<T>*> queue;
    TreeNode<T> *q = NULL;
    queue.push(root);
    while (!queue.empty()) {
        TreeNode<T> *p = queue.front();
        queue.pop();
        if (p->data == data) {
            q = p;
        }
        if (p->leftChild != NULL) {
            queue.push(p->leftChild);
        }
        if (p->rightChild != NULL) {
            queue.push(p->rightChild);
        }
    }
    return q;
}
template<typename T>
void BinaryTree<T>::PreOrder(TreeNode<T>* root) {
    if (root != NULL) {
        cout << root->data;
        PreOrder(root->leftChild);
        PreOrder(root->rightChild);
    }
}
template<typename T>
void BinaryTree<T>::InOrder(TreeNode<T> *root) {
    if (root != NULL) {
        InOrder(root->leftChild);
        cout << root->data;
        InOrder(root->rightChild);
    }
}
template<typename T>
void BinaryTree<T>::PostOrder(TreeNode<T> *root) {
    if (root != NULL) {
        PostOrder(root->leftChild);
        PostOrder(root->rightChild);
        cout << root->data;
    }
}
int main() {
    string str;
    while (cin >> str) {
        BinaryTree<char> *bin = new BinaryTree<char>(str[0]);
        TreeNode<char> *root = bin->getroot();
        for (int i = 1; i < str.length(); i++) {
            if (str[i] != '.') {
                TreeNode<char> *p = bin->Search(root, str[(i - 1) / 2]);
                if (i % 2 == 0) {
                    bin->InsertRight(p, str[i]);
                }
                else {
                    bin->InsertLeft(p, str[i]);
                }
            }
        }
        bin->PreOrder(root);
        cout << endl;
    }
    return 0;
}

测试数据
ABCDEFGHIJKL
A.B...C.......D
ABCD.EF.G
T
ABC.D.E..FG...H
输出
ABDHIEJKCFLG
ABCD
ABDGCEF
T
ABDFGCEH

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-07 23:25
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这段代码的目的是创建一个二叉树,并通过顺序遍历(先序、中序和后序)来输出根节点到叶子节点的所有路径。然而,在Visual Studio 2017上能够正常运行,但在在线编辑器(如OJ)上却出现了Segmentation Fault错误。

    在OJ上出现此错误的原因可能有以下几点:

    1. 编译时错误:可能是编译过程中遇到的问题,例如语法错误或未定义的行为。
    2. 内存泄漏:如果在循环结构中没有正确释放资源,则可能会导致内存泄露,从而引发Segmentation Fault错误。
    3. 时间限制超时:有些编程竞赛中的任务可能对计算能力有特定要求,超出时间限制可能导致程序崩溃。
    4. 输入格式不匹配:在某些情况下,输入的数据格式与预期不符,也可能导致错误。

    为了解决上述问题,请尝试以下步骤:

    1. 检查代码

      • 确保你的代码遵循了所有关于空间管理和内存管理的规定,包括使用适当的数据类型和内存分配策略。
      • 检查是否存在循环引用或死循环,这可能导致资源泄漏。
      • 检查是否有任何不必要的分支或者条件语句,这些都可能导致内存泄漏。
    2. 优化代码

      • 尽量减少循环和递归调用的数量,以提高效率。
      • 如果有可能,考虑使用更有效的数据结构来存储信息。
      • 对于线性问题,可以考虑使用数组或链表代替哈希表。
    3. 调试工具

      • 使用调试工具(如Visual Studio Debugger或IDE的调试功能)来逐步执行程序并查看变量值,找出可能引起问题的部分。
    4. 性能分析

      • 在测试阶段,记录程序运行的时间和资源消耗,以确定是否存在性能瓶颈。
      • 分析每个操作的时间复杂度,确保算法是高效的。
    5. 外部依赖项

      • 确认所有依赖库都是最新版本且兼容当前环境,避免因依赖冲突导致的错误。
    6. 社区帮助

      • 如果你仍然无法解决错误,请向社区寻求帮助,特别是对于复杂的错误,可能需要更多的代码片段来进行深入分析。

    如果你提供完整的代码示例,我可以帮你进一步分析问题所在。

    评论

报告相同问题?