0

在测试了 insert 函数以及 swapSubTrees 和 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);
  }

 }
}

我的主要程序是:

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

  }

程序完全编译运行,开始打印从12开始的列表:

这是 binaryTree.txt 的内容:12 23 56 45 78 89 98 25 36 65 54

我有点困惑为什么它总是崩溃。有什么想法吗?当我手动构建列表时,程序不稳定。打印最后一项后,程序将挂起。现在它在尝试打印时挂起。我认为这是功能的问题。

非常感激

4

2 回答 2

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

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

您正在删除指向 lLink.... 的指针,这意味着您正在删除整个 lLink 并可能试图在其他地方重新访问它?

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

另一个在印刷中存在问题的潜在领域:-

   if(p != NULL)
    cout << p->info << endl;
    printTree(p->lLink);
    printTree(p->rLink);

您需要大括号来包含 if 语句主体中的多个语句...

于 2012-11-05T23:39:16.350 回答
2

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

 delete temp;

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

于 2012-11-05T23:41:58.907 回答