学长下的任务,要求是:创建一颗二叉树,使用前中后序遍历和层序遍历来遍历这课二叉树
#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;
struct TreeNode
{
char data;
TreeNode *lchild,*rchild;
};
class Tree
{
private:
TreeNode *head;
queue<TreeNode *> q;
public:
Tree()
{
head=NULL;
}
public:
void create_tree()
{
cout<<"请按照前序遍历的方式建造一棵树,#代表空节点!\n";
_cree_tree(head);
}
protected:
void _cree_tree(TreeNode * &t)
{
char ch;
cin>>ch;
if('#'==ch)
{
t=NULL;
return;
}
t=new TreeNode;
t->data=ch;
_cree_tree(t->lchild);
_cree_tree(t->rchild);
}
public:
void prelook()
{
if(NULL==head)
{
cout<<"这是一颗空树\n";
return;
}
cout<<"前序遍历:";
_prelook(head);
cout<<endl;
}
protected:
void _prelook(TreeNode * &t)
{
if(NULL==t)
{
return;
}
cout<<t->data<<" ";
_prelook(t->lchild);
_prelook(t->rchild);
}
public:
void inlook()
{
if(NULL==head)
{
cout<<"这是一颗空树\n";
return;
}
cout<<"中序遍历:";
_inlook(head);
cout<<endl;
}
protected:
void _inlook(TreeNode * &t)
{
if(NULL==t)
{
return;
}
_inlook(t->lchild);
cout<<t->data<<" ";
_inlook(t->rchild);
}
public:
void endlook()
{
if(NULL==head)
{
cout<<"这是一颗空树\n";
return;
}
cout<<"后序遍历:";
_endlook(head);
cout<<endl;
}
protected:
void _endlook(TreeNode * &t)
{
if(NULL==t)
{
return;
}
_endlook(t->lchild);
_endlook(t->rchild);
cout<<t->data<<" ";
}
public:
void levellook()
{
if(NULL==head)
{
cout<<"这是一颗空树!\n";
return;
}
cout<<"层序遍历:";
_begin(head);
_next();
cout<<endl;
}
protected:
void _begin(TreeNode* & t)
{
q.push(t);
}
void _next()
{
while(!q.empty())
{
TreeNode * item=q.front();
q.pop();
cout<<item->data<<" ";
if(NULL!=item->lchild)
{
q.push(item->lchild);
}
if(NULL!=item->rchild)
{
q.push(item->rchild);
}
}
}
public:
~Tree()
{
_delete(head);
}
protected:
void _delete(TreeNode * & t)
{
if(NULL==t)
{
return;
}
_delete(t->lchild);
_delete(t->rchild);
delete t;
}
};
int main()
{
while(true)
{
Tree tree;
char ch;
cout<<"如果要创建一颗树请输入1,否则输入2:";
cin>>ch;
int flag=1;
switch(ch)
{
case '1':
tree.create_tree();
break;
case '2':
break;
default:
cout<<"你的输入有问题,请重新输入\n";
flag=0;
break;
}
if(0==flag)
{
continue;
}
if('2'==ch)
{
break;
}
while(true)
{
cout<<"请选择你要进行的操作! 1.前序遍历 2.中序遍历 3.后续遍历 4.层序遍历 其他输入退出操作\n";
char order;
cin>>order;
switch(order)
{
case '1':
tree.prelook();
break;
case '2':
tree.inlook();
break;
case '3':
tree.endlook();
break;
case '4':
tree.levellook();
break;
default:
order='#';
break;
}
getchar();
if('#'==order)
{
break;
}
}
}
return 0;
}
代码虽然比较长,但是我感觉是很好理解的,每一块都是独立的一个部分,都可以单独拿出来