实验内容:
实现二叉树的建立。
利用递归与非递归实现二叉树的先序遍历操作。
利用递归与非递归实现二叉树的中序遍历操作。
利用递归与非递归实现二叉树的后序遍历操作。
实验代码:
#include<iostream>
#include<cstdlib>
#define MAX_TREE_SIZE 20
using namespace std;
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild; // 左右孩子指针
}BiTNode,*BiTree;
int CreateBiTree(BiTree &BT)
{
char ch;
cin>>ch;
if(ch=='#') // 当读到'#'时建立空二叉树
BT=NULL;
else
{
BT=(BiTree)malloc(sizeof(BiTNode));
BT->data=ch; // 建立根结点
CreateBiTree(BT->lchild); // 建立左子树
CreateBiTree(BT->rchild); // 建立右子树
}
return 1;
}
// 先序遍历二叉树的递归算法
void PreOrder(BiTree BT)
{
if(BT!=NULL)
{
cout<<BT->data; // 访问根节点
PreOrder(BT->lchild); // 先序递归遍历BT的左子树
PreOrder(BT->rchild); // 先序递归遍历BT的右子树
}
}
// 中序遍历二叉树的递归算法
void InOrder(BiTree BT)
{
if(BT!=NULL)
{
InOrder(BT->lchild); // 中序递归遍历BT的左子树
cout<<BT->data; // 访问根结点
InOrder(BT->rchild); // 中序递归遍历BT的右子树
}
}
// 后序遍历二叉树的递归算法
void PostOrder(BiTree BT)
{
if(BT!=NULL)
{
PostOrder(BT->lchild); // 后序递归遍历BT的左子树
PostOrder(BT->rchild); // 后序递归遍历BT的右子树
cout<<BT->data; // 访问根结点
}
}
// 先序遍历二叉树的非递归算法
void NRPreOrder(BiTree BT)
{
BiTree stack[MAX_TREE_SIZE],p;
int top;
if(BT!=NULL)
{
top=1;
stack[top]=BT; // 根结点入栈
while(top>0) // 栈不为空时循环
{
p=stack[top]; // 退栈并访问该结点
top--;
cout<<p->data; // 输出该结点数据域
if(p->rchild!=NULL) // 右孩子入栈
{
top++;
stack[top]=p->rchild;
}
if(p->lchild!=NULL) // 左孩子入栈
{
top++;
stack[top]=p->lchild;
}
}
}
}
// 中序遍历二叉树的非递归算法
void NRInOrder(BiTree BT)
{
BiTree stack[MAX_TREE_SIZE],p; // 扫描*p的所有左结点并入栈
int top=0;
p=BT;
do
{
while(p!=NULL)
{
top++;
stack[top]=p;
p=p->lchild;
}
if(top>0)
{
p=stack[top]; // 出栈*p结点
top--;
cout<<p->data; // 访问p结点
p=p->rchild; // 扫描*p的右孩子结点
}
}while(p!=NULL || top>0);
}
// 后序遍历二叉树的非递归算法
void NRPostOrder(BiTree BT)
{
BiTree stack[MAX_TREE_SIZE],p;
int tag[MAX_TREE_SIZE];
int top=0;
p=BT;
do
{
while(p!=NULL) // 扫描*p的所有左结点并入栈
{
top++;
stack[top]=p;
p=p->lchild;
tag[top]=0; // 表示当前结点的左子树已访问过
}
if(top>0)
{
if(tag[top]==1) // 左右结点均已访问过,则访问该结点
{
cout<<stack[top]->data;
top--;
}
else
{
p=stack[top];
if(top>0)
{
p=p->rchild; // 扫描右结点
tag[top]=1; // 表示当前结点的右子树已访问过
}
}
}
}while(p!=NULL || top>0);
}
int main()
{
BiTree Bt;
CreateBiTree(Bt);
cout<<"成功创建二叉树!"<<endl;
cout<<"先序遍历序列(递归):";
PreOrder(Bt);
cout<<endl;
cout<<"先序遍历序列(非递归):";
NRPreOrder(Bt);
cout<<endl;
cout<<"中序遍历序列(递归):";
InOrder(Bt);
cout<<endl;
cout<<"中序遍历序列(非递归):";
NRInOrder(Bt);
cout<<endl;
cout<<"后序遍历序列(递归):";
PostOrder(Bt);
cout<<endl;
cout<<"后序遍历序列(非递归):";
NRPostOrder(Bt);
cout<<endl;
return 0;
}
实验代码运行结果展示
|