所有!
我正在尝试开发一个函数,它使二元树预先线程然后打印它,但我遇到了一些麻烦。代码已编译但是当我运行程序时它会崩溃。您可以在下面找到我的代码。
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
#define MaxNodeNum 50
class ThreadTree;
istream& operator>>(istream& in,ThreadTree& Tree);
struct ThreadNode{`int ltag,rtag;
ThreadNode *leftChild,*rightChild;
char data;
ThreadNode():data(NULL),leftChild(NULL),
rightChild(NULL),ltag(0),rtag(0){}
ThreadNode(const char item):data(item),leftChild(NULL),
rightChild(NULL),ltag(0),rtag(0){}
};
class ThreadTree{`protected:
ThreadNode *root;
char *element;
int CurNodeNum;
void CreateBinTree(ThreadNode*& subTree);
friend istream& operator>>(istream& in,ThreadTree& Tree);
void createPreThread(ThreadNode *current,ThreadNode *& pre);
void destroy(ThreadNode *&subTree);
public:
ThreadTree():root(NULL){}
void createPreThread();
ThreadNode *Root()
{ return root; }
void ConstructTree(char A[],int n,int i,ThreadNode *& ptr);
ThreadNode *First(ThreadNode *current);
ThreadNode *Next(ThreadNode *current);
void PreOrder();
~ThreadTree(){ destroy(root); }
};
void ThreadTree::CreateBinTree(ThreadNode*& subTree){
char s[MaxNodeNum];
cout<<"Input the nodes,'#'represents null nodes,the number of nodes<="<<MaxNodeNum<<endl;
cin>>s;
CurNodeNum=strlen(s);
element=new char[CurNodeNum];
for(int i=0;i<CurNodeNum;i++)
element[i]=s[i];
}
void ThreadTree::ConstructTree(char A[],int n,int i,ThreadNode *& ptr){
if(i>=n) ptr=NULL;
else{
if(A[i]!='#'){
ptr=new ThreadNode(A[i]);
ConstructTree(A,n,2*i+1,ptr->leftChild);
ConstructTree(A,n,2*i+2,ptr->rightChild);
}
else i++;
}
}
istream& operator>>(istream& in,ThreadTree& Tree){
Tree.CreateBinTree(Tree.root);
Tree.ConstructTree(Tree.element,Tree.CurNodeNum,0,Tree.root);
return in;
}
void ThreadTree::createPreThread(){
ThreadNode *pre=NULL;
if(root!=NULL){
createPreThread(root,pre);
pre->rightChild=NULL; pre->rtag=1;
}
}
void ThreadTree::createPreThread(ThreadNode *current,ThreadNode *& pre){
if(current==NULL) return;
if(current->leftChild==NULL){
current->leftChild=pre;
current->ltag=1;
}
if(pre!=NULL && pre->rightChild==NULL){
pre->rightChild=current;
pre->rtag=1;
}
pre=current;
createPreThread(current->leftChild,pre);
createPreThread(current->rightChild,pre);
}
ThreadNode* ThreadTree::First(ThreadNode *current){
return current;
}
ThreadNode * ThreadTree::Next(ThreadNode *current){
if(current->ltag==1){
if(current->rightChild==NULL)
return NULL;
else
return current->rightChild;
}else
return current->leftChild;
}
void ThreadTree::PreOrder(){
ThreadNode *q;
for(q=First(root);q!=NULL;q=Next(q))
cout<<q->data<<" ";
}
void ThreadTree::destroy(ThreadNode *&subTree){
if(subTree!=NULL){
destroy(subTree->leftChild);
destroy(subTree->rightChild);
delete subTree;
}
}
int main(){
ThreadTree tree;
cin>>tree;
tree.createPreThread();
cout<<tree.Next(tree.Root())->data;
cout<<endl;
tree.PreOrder();
return 0;
}
请帮我解决这个问题。 提前谢谢!