二叉树 错误原因

bevig64 2014-11-03 09:58:10
#include <iostream>
using namespace std;
//树节点类
class TreeNode
{
private:
char data;
TreeNode *lptr,*rptr;
public:
//构造函数
TreeNode(char item='#',TreeNode*left=NULL,TreeNode*right=NULL):data(item),lptr(left),rptr(right){}
//析构函数
~TreeNode(){}
void setleft(TreeNode *l)
{
lptr=l;
}
TreeNode*getleft()
{
return lptr;
}
void setright(TreeNode *r)
{
rptr=r;
}
TreeNode*getright()
{
return rptr;
}
void setdata(char item)
{
data=item;
}
char getdata()
{
return data;
}
};
//树类
class Tree
{
private:
TreeNode *root;
public:
//构造函数
Tree(TreeNode *t=NULL):root(t){}
//析构函数
~Tree(){}
int preorder(TreeNode *t);
int inorder(TreeNode *t);
int postorder(TreeNode *t);
TreeNode *getroot(){return root;}
};
//树的创建
int creat(TreeNode *p)
{
char c;
cin>>c;
if(c=='#')
{
p=NULL;
}
else{p=new TreeNode(c);}
creat(p->getleft());
creat(p->getright());
return 0;
}
//递归的先根遍历
int Tree::preorder(TreeNode *t)
{
if(t==NULL) return 0;
cout<<t->getdata()<<' ';
preorder(t->getleft());
preorder(t->getright());
return 0;
}
//递归的中根遍历
int Tree::inorder(TreeNode *t)
{
if(t==NULL) return 0;
inorder(t->getleft());
cout<<t->getdata()<<' ';
inorder(t->getright());
return 0;
}
//递归的后根遍历
int Tree::postorder(TreeNode *t)
{
if(t==NULL) return 0;
postorder(t->getleft());
postorder(t->getright());
cout<<t->getdata()<<' ';
return 0;
}
//堆栈类
class AStack
{
private:
int size;
TreeNode *node;
int top;
public:
AStack(){};
AStack(int max){size=max;node=new TreeNode [max];top=-1;}
~AStack(){delete[]node;}
bool Push(TreeNode &item);
bool Pop(TreeNode &item);
bool Peek(TreeNode &item);
};
//压入
bool AStack::Push(TreeNode &item)
{
node[top++]=item;
return 1;
}
//弹出
bool AStack::Pop(TreeNode &item)
{
item=node[top--];
return 1;
}
//取栈顶
bool AStack::Peek(TreeNode &item)
{
item=node[top];
return 1;
}
//队列类
class AQueue
{
private:
int fron;//队列首数据所在下表
int rear;//队列尾数据所在下标
int qsize;//队列长度
int l;//队列长度
TreeNode *p;
public:
AQueue(int item=100){qsize=item;p=new TreeNode[qsize];fron=0;rear=0;l=0;}
~AQueue(){delete[]p;}
int charu(TreeNode &item)
{
p[rear++]=item;
l++;
return 0;
}
int shuchu(TreeNode &item)
{
item=p[fron++];
l--;
return 0;
}
bool panduan()
{
if (l==0) return 0;
else return 1;
}
};
//先根非递归
int pprint(Tree *t,int num)
{
AStack a(num);
TreeNode *p;
p=t->getroot();
while(p!=NULL)
{
cout<<p->getdata();
if(p->getright()!=NULL)
{
cout<<p->getright()->getdata()<<"压栈"<<endl;
a.Push(*p->getright());
}
if(p->getleft()!=NULL)
{
p=p->getleft();
}
if(p->getleft()==NULL)
{
a.Pop(*p);
cout<<p->getdata()<<"弹出"<<endl;
}
}
return 0;
}
//层次遍历二叉树
TreeNode *fseek(Tree *t,char c)
{
TreeNode *p;
p=t->getroot();
AQueue a;
if(p!=NULL) a.charu(*p);
while(a.panduan())
{
a.shuchu(*p);
cout<<p->getdata()<<endl;
if(p->getleft()!=NULL) a.charu(*p->getleft());
if(p->getright()!=NULL) a.charu(*p->getright());
}
return NULL;

}
//寻找树中节点的层数
void level(TreeNode *root,char val,int &ans,int lev)
{
//lev为中间变量,初始值为0,记录层数
if(root==NULL)
ans=-1;
else if(root->getdata()==val)
ans=lev;
else
{
level(root->getleft(),val,ans,lev+1);//在左子树中查找
if(ans==-1)
level(root->getright(),val,ans,lev+1);//在右子树中查找
}
}
int findlevel(Tree root)
{
char c;
int ans,lev=0;
TreeNode *p;
p=root.getroot();
cout<<"请输入要寻找的节点的值:"<<endl;
cin>>c;
level(p,c,ans,lev);
if(ans==-1)
{
cout<<"树中无该数据!"<<endl;
return 0;
}
cout<<c<<"所在的层数为"<<ans<<"层"<<endl;
return 0;
}
int main()
{
int i;
TreeNode tmp;
TreeNode *root;
root=&tmp;
//二叉树创建
cout<<"请创建二叉树以”#“表示空"<<endl;
creat(root);
cout<<"创建成功!"<<endl;
Tree r(root);
Tree *p;
p=&r;
while(i!=0)
{
cout<<"请输入要实现的功能:"<<endl<<"(1.递归的先根遍历 2.递归的中根遍历 3.递归的后根遍历 4.非递归的先根遍历 5.查找节点所在层数 0.退出)"<<endl;
cin>>i;
switch(i)
{
case 1: r.preorder(r.getroot());break;
case 2: r.inorder(r.getroot());break;
case 3: r.postorder(r.getroot());break;
case 4: pprint(p,100);break;
case 5: findlevel(r);break;
default:cout<<"ERROR! 请重新输入"<<endl;
}
}
return 0;
}
...全文
115 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

64,643

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧