C++ 二叉树:从文件读取崩溃

C++ 二叉树:从文件读取崩溃,c++,C++,在测试了insert函数、swapusubtrees和printTree函数之后,我终于让我的所有函数都正常工作了。现在我需要从一个文件创建一个二叉树,然后打开该文件并读取该文件的第一个整数,但是我的程序崩溃了 这里有一大堆代码,我不想把代码堆成一堵墙。我将张贴我的重要部分,如果需要,将提供其余的代码,如果要求 我的交换和打印功能是: template<class elemType> void bSearchTreeType<elemType>::printTree()

在测试了insert函数、swapusubtrees和printTree函数之后,我终于让我的所有函数都正常工作了。现在我需要从一个文件创建一个二叉树,然后打开该文件并读取该文件的第一个整数,但是我的程序崩溃了

这里有一大堆代码,我不想把代码堆成一堵墙。我将张贴我的重要部分,如果需要,将提供其余的代码,如果要求

我的交换和打印功能是:

template<class elemType>
void bSearchTreeType<elemType>::printTree()
{
printTree(root);
}
template<class elemType>
void bSearchTreeType<elemType>::printTree(nodeType<elemType> *p)
{
if(p != NULL)
cout << p->info << endl;
printTree(p->lLink);
printTree(p->rLink);
}

template<class elemType>
void bSearchTreeType<elemType>::swapSubtrees(nodeType<elemType> * p)
{

 if (p != NULL)
  {

   if (p->lLink != NULL && p->rLink != NULL)
    {

      nodeType<elemType> * temp = p->lLink;
      p->lLink = p->rLink;
      p->rLink = temp;
      delete temp;
    }

  if (p->lLink != NULL && p->rLink == NULL)
   {
    swapSubtrees(p->lLink);
   }

 if (p->rLink != NULL && p->lLink == NULL)
  {
   swapSubtrees(p->rLink);
  }

 }
}
模板
void bSearchTreeType::printTree()
{
打印树(根);
}
模板
void bSearchTreeType::printTree(节点类型*p)
{
如果(p!=NULL)
cout-info-lLink);
打印树(p->rLink);
}
模板
void bSearchTreeType::SwapusubTrees(节点类型*p)
{
如果(p!=NULL)
{
如果(p->lLink!=NULL&&p->rLink!=NULL)
{
节点类型*temp=p->lLink;
p->lLink=p->rLink;
p->rLink=温度;
删除临时文件;
}
如果(p->lLink!=NULL&&p->rLink==NULL)
{
Swapusubtrees(p->lLink);
}
如果(p->rLink!=NULL&&p->lLink==NULL)
{
交换树(p->rLink);
}
}
}
我的主要课程是:

#include<iostream>
#include<fstream>
#include<cstdlib>
#include "binarySearchTree.h"

using namespace std;

int main()
{
bSearchTreeType<int>bt;
ifstream infile;

infile.open("binaryTree.txt");

if(!infile){
    cout<<"File not found"<<endl;
}

int tree;

while(infile>> tree)
{
    bt.insert(tree);
}

bt.swapSubtrees();

bt.printTree();
bt.swapSubtrees();

system("PAUSE");
return 0;

  }
#包括
#包括
#包括
#包括“binarySearchTree.h”
使用名称空间std;
int main()
{
b搜索快报;
河流充填;
open(“binaryTree.txt”);
如果(!infle){
cout
if(p->lLink!=NULL&&p->rLink!=NULL)
{
节点类型*temp=p->lLink;
p->lLink=p->rLink;
p->rLink=温度;
删除临时文件;
}
您正在删除一个指向lLink的指针……这意味着您正在删除整个lLink,并可能试图在其他地方重新访问它

处理这个问题的方法是只将temp设置为null,而不是删除。但这并不重要,因为temp是该块中的一个局部变量,它在temp设置为null后立即超出范围

另一个可能存在印刷问题的领域:-

   if(p != NULL)
    cout << p->info << endl;
    printTree(p->lLink);
    printTree(p->rLink);
if(p!=NULL)
cout-info-lLink);
打印树(p->rLink);
您需要大括号来包含if语句体中的多个语句…

if(p->lLink!=NULL&&p->rLink!=NULL)
{
节点类型*temp=p->lLink;
p->lLink=p->rLink;
p->rLink=温度;
删除临时文件;
}
您正在删除一个指向lLink的指针……这意味着您正在删除整个lLink,并可能试图在其他地方重新访问它

处理这个问题的方法是只将temp设置为null,而不是删除。但这并不重要,因为temp是该块中的一个局部变量,它在temp设置为null后立即超出范围

另一个可能存在印刷问题的领域:-

   if(p != NULL)
    cout << p->info << endl;
    printTree(p->lLink);
    printTree(p->rLink);
if(p!=NULL)
cout-info-lLink);
打印树(p->rLink);
您需要大括号来包含if语句体中的多个语句…

我认为(不运行代码)的问题在于:

在交换三内。您正在复制指向临时的指针,而不是创建新指针。无需删除它。 由于内存分配的变幻莫测,您的程序有时会在不同的部分运行,有时会失败。

我认为(不运行代码)的问题在于:

在交换三内。您正在复制指向临时的指针,而不是创建新指针。无需删除它。
由于内存分配的变幻莫测,您的程序有时可能会在不同的部分运行,有时会失败。

当您使用调试器进行调试时,会出现什么错误?我猜这是一个空指针,proj8.exe中0x777415de处存在未经处理的异常:0xC0000005:访问冲突读取位置0x00000004。为什么要删除g
bSearchTreeType::swapusubtrees
中的g
temp
?它只是一个指针。它不是一个完全分配的对象。因此,您正在删除它所指向的对象,这是您的新rlink。如果您想彻底了解,只需将指针设置为null。不要删除它。请检查我对大括号的最新编辑,看看是否有帮助。当您逐步完成时,请h使用调试器时会出现什么错误?我猜它是一个空指针,proj8.exe中0x777415de处未处理的异常:0xC0000005:访问冲突读取位置0x00000004。为什么要删除
bSearchTreeType::swapusubtrees
中的
temp
?它只是一个指针。它不是一个完全分配的对象。所以您被删除了正在删除它所指向的内容,这是您的新rlink。如果您想彻底了解,只需将指针设置为null。不要删除它。检查我最近对大括号的编辑,看看是否有帮助。我删除了这个,程序仍然挂起我删除了这个,程序仍然挂起现在我将它在visual studio中运行,但当我将它移植到我的linux mac上时hine它编译了,但我收到了一个分段错误。你有什么想法吗?我的gdb告诉我如果(p->lLink!=NULL&&p->rLink!=NULL)在
处有一个分段错误
有什么想法吗?现在我在visual studio中使用它,但是当我将它移植到我的linux机器上时,它会编译,但我收到一个分段错误。有什么想法吗?我的gdb告诉我如果(p->lLink!=NULL&&p->rLink!=NULL)
有什么想法吗?
 delete temp;