二叉树的建立与遍历
以下面这棵树为例:
#include <bits/stdc++.h>
#define SIZE 100
using namespace std;
typedef struct BiTNode //定义二叉树节点结构
{
char data; //数据域
struct BiTNode *lchild,*rchild; //左右孩子指针域
} BiTNode,*BiTree;
//建立二叉树
void CreateBiTree(BiTree &T)
{
char ch;
scanf("%c",&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)
{
printf("%c ",T->data); //访问结点
PreOrder(T->lchild); //遍历左子树
PreOrder(T->rchild); //遍历右子树
}
}
void InOrder(BiTree T)
{
if(T)
{
InOrder(T->lchild);
printf("%c ",T->data);
InOrder(T->rchild);
}
}
void PostOrder(BiTree T)
{
if(T)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c ",T->data);
}
}
void InOrderTraverse(BiTree T)
{
stack<BiTree> S;
BiTree p;
S.push(T);
while(!S.empty())
{
while((p=S.top())&&p)
{
printf("%c ",p->data);
S.push(p->lchild);
}
S.pop();
if(!S.empty())
{
p=S.top();
S.pop();
S.push(p->rchild);
}
}
}
int visit (BiTree T)
{
if(T)
{
printf("%c ",T->data);
return 1;
}
else
return 0;
}
void LeverTraverse(BiTree T)
{
queue<BiTree> 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 main()
{
BiTree T;
char j;
int flag=1;
printf("本程序实现二叉树的操作:\n");
printf("叶子节点以空格表示。\n");
printf("可以进行二叉树,递归先序,中序,后序遍历,非递归先序,中序遍历,及非递归层序遍历等操作。\n");
printf("请建立二叉树。\n");
printf("例如:1 2 3 4 5 6 (回车)\n");
CreateBiTree(T); //初始化队列
getchar();
while(flag)
{
printf("\n");
printf("请选择: \n");
printf("1.递归先序遍历\n");
printf("2.递归中序遍历\n");
printf("3.递归后序遍历\n");
printf("4.非递归中序遍历\n");
printf("5.非递归先序遍历\n");
printf("6.非递归层序遍历\n");
printf("0.退出程序\n");
scanf(" %c",&j);
switch(j)
{
case '1':
if(T)
{
printf("递归先序遍历二叉树:");
PreOrder(T);
printf("\n");
}
else
printf("二叉树为空!\n");
break;
case '2':
if(T)
{
printf("递归中序遍历二叉树:");
InOrder(T);
printf("\n");
}
else
printf("二叉树为空!\n");
break;
case '3':
if(T)
{
printf("递归后序遍历二叉树:");
PostOrder(T);
printf("\n");
}
else
printf("二叉树为空!\n");
break;
case '4':
if(T)
{
printf("非递归中序遍历二叉树:");
InOrderTraverse(T);
printf("\n");
}
else
printf("二叉树为空!\n");
break;
case '5':
if(T)
{
printf("非递归先序遍历二叉树:");
InOrderTraverse(T);
printf("\n");
}
else
printf("二叉树为空!\n");
break;
case '6':
if(T)
{
printf("非递归层序遍历二叉树:");
LeverTraverse(T);
printf("\n");
}
else
printf("二叉树为空!\n");
break;
default:
flag=0;
printf("程序运行结束,按任意键退出!\n");
}
}
}