中序二叉树线索化 问题
#include<iostream>
using namespace std;
typedef char DataType;
typedef struct Node
{
DataType data;
struct Node* lchild;
struct Node* rchild;
int ltag,rtag;
}ThredBinTree;
ThredBinTree *pre=NULL;
ThredBinTree *next=NULL;//全局变量
void CreateTree(ThredBinTree* &rt)//创建树
{
DataType item;
cin>>item;
if(item=='#')
rt=NULL;
else
{
rt=new ThredBinTree;
if(!rt)
{
cout<<"failure!"<<endl;
return;
}
rt->ltag=0;
rt->rtag=0;
CreateTree(rt->lchild);
CreateTree(rt->rchild);
}
}
void DisplayTree(ThredBinTree* root)//中序遍历二叉树
{
if(root!=NULL)
{
DisplayTree(root->lchild);
cout<<root->data<<" ";
DisplayTree(root->rchild);
}
}
void InThred(ThredBinTree* &root)//线索化二叉树
{
if(root!=NULL)
{
InThred(root->lchild);
if(root->lchild==NULL)
{
root->ltag=1;
root->lchild=pre;
}
if(pre!=NULL && pre->rchild==NULL)
{
pre->rchild=root;
pre->rtag=1;
}
pre=root;
InThred(root->rchild);
}
}
ThredBinTree* InPre(ThredBinTree *p)//找节点前驱
{
if(p->ltag==1)
pre=p->lchild;
else
{
ThredBinTree *q=new ThredBinTree;
for(q=p->lchild;q->rtag==0;q=q->rchild);
pre=q;
delete q;
}
return pre;
}
ThredBinTree* InNext(ThredBinTree *p)//后继
{
if(p->rtag==1)
next=p->rchild;
else
{
ThredBinTree *q=new ThredBinTree;
for(q=p->rchild;q->ltag==0;q=q->lchild);
next=q;
delete q;
}
return next;
}
ThredBinTree* InFirst(ThredBinTree *bt)//求第一个节点
{
ThredBinTree *p=bt;
if(!p)
return NULL;
while(p->ltag==0)
p=p->lchild;
return p;
}
void InOrder(ThredBinTree *bt)//遍历中序二叉树
{
ThredBinTree *p;
p=InFirst(bt);
while(p)
{
cout<<p->data;
p=InNext(p);
}
}
int main()
{
ThredBinTree *root=NULL;
cout<<"Please enter the tree with inorder:"<<endl;
CreateTree(root);
cout<<endl<<"The inoder of the binary tree are :"<<endl;
DisplayTree(root);
InThred(root);
cout<<endl<<"The thred inorder of the binary tree are :"<<endl;
InOrder(root);
delete root;
return 0;
}
程序中以二叉树的中序输入(节点的子树若为空则输入#,例如输入ab#d##c#e##)
但是不知道怎么回事程序输出的都是x,还请高手帮忙,谢谢~~~
[解决办法]
首先,用中序进行输入建立树在本程序中不可能实现,按照楼主的代码估计是按先序建立。另外楼主的问题,估计也是以上几位所说的原因,即没有分配空间。但是本人对于C++也在学习中,不甚了解,无法进行调试,如果楼主需要可以用C语言编写的代码发上去。
[解决办法]
void CreateTree(ThredBinTree* &rt)//创建树
{
DataType item;
cin>>item;
if(item=='#')
rt=NULL;
else
{
rt=new ThredBinTree;
if(!rt)
{
cout < <"failure!" < <endl;
return;
}
rt->ltag=0;
rt->rtag=0;
rt->data=item;
CreateTree(rt->lchild);
CreateTree(rt->rchild);
}
void InThred(ThredBinTree* &root)//线索化二叉树
{
if(root!=NULL)
{
InThred(root->lchild);
if(root->lchild==NULL)
{
root->ltag=1;
root->lchild=pre;
}
if(root->rchild==NULL) root->rtag=1;
if(pre!=NULL && pre->rchild==NULL)
{
pre->rchild=root;
//pre->rtag=1;
}
pre=root;
InThred(root->rchild);
}
}
ThredBinTree* InNext(ThredBinTree *p)//后继
{
if(p->rtag==1)
//next=p->rchild;
return p->rchild;
else
{
ThredBinTree *q;//=new ThredBinTree;
for(q=p->rchild;q->ltag==0;q=q->lchild);
//next=q;
return q;
//delete q;
}
return next;
}