、二叉树的顺序存储表示和实现 (1)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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<<"可以进行建立二叉树,递归先序、递归中序、递归后序遍历,非递归先序、非递归中序遍历及非递归层序遍历操作。"<//------------------------
cout<<"请建立二叉树。"</* 建树是利用前序递归方法建树,在建树时,要注意输入时的字符顺序,建树的结束是以遍历所有的节点,每个节点的叶子节点都是#*/
CreateBiTree(T); //初始化队列
getchar();
while(flag)
{
cout<<"请选择: "<cout<<"1.递归先序遍历"<cout<<"2.递归中序遍历"<cout<<"3.递归后序遍历"<cout<<"4.非递归先序遍历"<cout<<"5.非递归种序遍历"<cout<<"6.非递归层序遍历"<cout<<"0.退出程序"<cin>>ch;
switch(ch)
{

case '1':
if(T)
{
cout<<"递归先序遍历二叉树:";
PreOrder(T);
cout<}
else
cout<<"二叉树为空!"<break;
case '2':
if(T)
{
cout<<"递归中序遍历二叉树:";
InOrder(T);
cout<}
else
cout<<"二叉树为空!"<break;
case '3':
if(T)
{
cout<<"递归后序遍历二叉树:";
PostOrder(T);
cout<}
else
cout<<"二叉树为空!"<break;

case '4':
if(T)
{
cout<<"非递归先序遍历二叉树:";
PreOrder_Nonrecursive(T);
cout<}
else
cout<<"二叉树为空!";
break;
case '5':
if(T)
{
cout<<"非递归中序遍历二叉树:";
InOrderTraverse(T);
cout<}
else
cout<<"二叉树为空!"<break;
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<data; //访问结点
PreOrder(T->lchild); //遍历左子树
PreOrder(T->rchild); //遍历右子树
}
}

//中序遍历的递归
void InOrder(BiTree T)
{
if(T)
{
InOrder(T->lchild); //遍历左子树
cout<data; //访问结点
InOrder(T->rchild); //遍历右子树
}
}

//后序遍历的递归
void PostOrder(BiTree T)
{
if(T)
{
PostOrder(T->lchild); //遍历左子树
PostOrder(T->rchild); //访问结点
cout<data; //遍历右子树
}
}

//非递归中序遍历
void InOrderTraverse(BiTree T)
{
stack S;
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<data<<" ";
S.push(p->rchild);
}
}

}

//非递归先序遍历
void PreOrder_Nonrecursive(BiTree T)
{
stack S;
BiTree p;
S.push(T);//根指针进栈
while(!S.empty())//栈空时结束
{
while((p=S.top())&&p)
{
cout<data<<" ";
S.push(p->lchild);
}//向左走到尽头
S.pop();//弹出堆栈
if(!S.empty())
{
p=S.top();
S.pop();
S.push(p->rchild);//向右走一步
}
}
}

//非递归层次遍历
void LeverTraverse(BiTree T)
{
queue Q;
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<data;
return 1;
}
else
return 0;
}



相关文档
最新文档