、二叉树的顺序存储表示和实现 (1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#include
#include
#include
#define SIZE 100
using namespace std;
typedef struct BiTNode //定义二叉树节点结构
{
char data; //数据域
struct BiTNode *lchild,*rchild; //左右孩子指针域
}BiTNode,*BiTree;
int visit(BiTree t);
void CreateBiTree(BiTree &T); //生成一个二叉树
void PreOrder(BiTree); //递归先序遍历二叉树
void InOrder(BiTree); //递归中序遍历二叉树
void PostOrder(BiTree); //递归后序遍历二叉树
void InOrderTraverse(BiTree T); //非递归中序遍历二叉树
void PreOrder_Nonrecursive(BiTree T);//非递归先序遍历二叉树
void LeverTraverse(BiTree T);//非递归层序遍历二叉树
//主函数
void main()
{
BiTree T;
char ch;
int flag=1;
//------------
cout<<"对二叉树的操作,叶子结点以#表示"<
cout<<"请建立二叉树。"<
CreateBiTree(T); //初始化队列
getchar();
while(flag)
{
cout<<"请选择: "<
switch(ch)
{
case '1':
if(T)
{
cout<<"递归先序遍历二叉树:";
PreOrder(T);
cout<
else
cout<<"二叉树为空!"<
case '2':
if(T)
{
cout<<"递归中序遍历二叉树:";
InOrder(T);
cout<
else
cout<<"二叉树为空!"<
case '3':
if(T)
{
cout<<"递归后序遍历二叉树:";
PostOrder(T);
cout<
else
cout<<"二叉树为空!"<
case '4':
if(T)
{
cout<<"非递归先序遍历二叉树:";
PreOrder_Nonrecursive(T);
cout<
else
cout<<"二叉树为空!";
break;
case '5':
if(T)
{
cout<<"非递归中序遍历二叉树:";
InOrderTraverse(T);
cout<
else
cout<<"二叉树为空!"<
case '6':
if(T)
{
cout<<"非递归层序遍历二叉树:";
LeverTraverse(T);
cout<
else
cout
<<"二叉树为空!";
break;
default:
flag=0;
cout<<"程序运行结束,按任意键退出!";
cout<
}
}
//建立二叉树
void CreateBiTree(BiTree &T)
{
char ch;
cin>>ch; //读入一个字符
if(ch=='#')
T=NULL;
else
{
T=(BiTNode *)malloc(sizeof(BiTNode)); //生成一个新结点
T->data=ch;
CreateBiTree(T->lchild); //生成左子树
CreateBiTree(T->rchild); //生成右子树
}
}
//先序遍历的递归
void PreOrder(BiTree T)
{
if(T)
{
cout<
PreOrder(T->lchild); //遍历左子树
PreOrder(T->rchild); //遍历右子树
}
}
//中序遍历的递归
void InOrder(BiTree T)
{
if(T)
{
InOrder(T->lchild); //遍历左子树
cout<
InOrder(T->rchild); //遍历右子树
}
}
//后序遍历的递归
void PostOrder(BiTree T)
{
if(T)
{
PostOrder(T->lchild); //遍历左子树
PostOrder(T->rchild); //访问结点
cout<
}
}
//非递归中序遍历
void InOrderTraverse(BiTree T)
{
stack
BiTree p;
S.push(T);//跟指针进栈
while(!S.empty())
{
p=new BiTNode;
while((p=S.top())&&p)
S.push(p->lchild);//向左走到尽头
S.pop(); //空指针退栈
if(!S.empty())
{
p=S.top();
S.pop();
cout<
S.push(p->rchild);
}
}
}
//非递归先序遍历
void PreOrder_Nonrecursive(BiTree T)
{
stack
BiTree p;
S.push(T);//根指针进栈
while(!S.empty())//栈空时结束
{
while((p=S.top())&&p)
{
cout<
S.push(p->lchild);
}//向左走到尽头
S.pop();//弹出堆栈
if(!S.empty())
{
p=S.top();
S.pop();
S.push(p->rchild);//向右走一步
}
}
}
//非递归层次遍历
void LeverTraverse(BiTree T)
{
queue
BiTree p;
p = T;
if(visit(p)==1)
Q.push(p);
while(!Q.empty())
{
p=Q.front();
Q.pop();
if(visit(p->lchild) == 1)
Q.push(p->lchild);
if(visit(p->rchild) == 1)
Q.push(p->rchild);
}
}
int visit(BiTree T)
{
if(T)
{
cout<
return 1;
}
else
return 0;
}