实验题目:二叉树的遍历
实验目的
- 掌握Dev-C++环境下的编译、调试和执行的方法及步骤。
- 掌握二叉树的先序遍历、中序遍历和后序遍历的递归算法和非递归算法。
实验内容
-
就下面给定的二叉树,创建二叉树。
-
实现二叉树的递归遍历算法和非递归遍历算法,依次输出二叉树的先序、中序和后序遍历序列。(非递归选作)
-
遍历二叉树,输出结点值大于C的结点,而小于等于C的结点用*替代。(根据代码提示,补全程序)
-
遍历二叉树,输出结点值小于D的结点,而大于等于D的结点用*替代。(自行完成)
实验要求
-
括号表示法创建二叉树(上次实验内容)
定义二叉树结点的结构和实现创建运算CreateBTNode、输出运算DispBTNode的算法,设置结点数据的数据类型。-
-
在“main.cpp”里,主函数main()里定义字符数组str;
-
在“main.cpp”里,主函数main()里声明二叉树指针变量T,调用CreateBTNode创建二叉树;
-
在“main.cpp”里,主函数main()里调用DispBTNode显示二叉树。
-
-
实现二叉树的递归遍历算法
-实现二叉树先序递归算法PreOrder、中序递归算法In Order、后序递归算法PostOrder;- 在“main.cpp”里,主函数main()里调用三种递归遍历算法,显示各自序列。
- 在“main.cpp”里,主函数main()里调用三种递归遍历算法,显示各自序列。
-
实现二叉树的非递归遍历算法(选做)
-
在项目中新建文件“SqStack.h”,在该文件中定义顺序栈类型和实现进栈、出栈等基本运算;
-
“BiTree.h”中,实现二叉树先序非递归算法NonRecurPreOrder、中序非递归算法NonRecurInOrder、后序非递归算法NonRecurPostOrder;
-
“BiTree.h”中,引入头文件#include “SqStack.h”,设置好栈中元素的数据类型,注意此时栈中元素的数据类型应为二叉树指针,即:“typedef BTNode* SElemType;”
-
在“main.cpp”里,主函数main()里调用三种非递归遍历算法,显示各自序列。
-
-
遍历二叉树,输出结点值大于C的结点,小于等于C的用*替代
- 采用递归遍历方式,采取在遍历过程中对每个结点调用函数的方式
- 在文件“BiTree.h”中增加关于二叉树先序递归、中序递归和后序递归如下:
- 在“main.cpp”里,主函数main()前面,定义函数DispLargeThanC,该函数就是递归遍历过程中,要对每个结点执行的操作,函数定义如下所示:
typedef void Status;
- 在“main.cpp”里,主函数main()里,调用相应函数,即添加如下代码:
实验过程记录
- 实现二叉树的递归遍历算法
void PreOrder(BTNode *b)
{
if(b!=NULL)
{
printf("%c ",b->data);//访问根结点
PreOrder(b->lchild);//先序遍历左子树
PreOrder(b->rchild);//先序遍历右子树
}
}
void InOrder(BTNode *b)
{
if(b!=NULL)
{
InOrder(b->lchild);//中序遍历左子树
printf("%c ",b->data);//访问根结点
InOrder(b->rchild);//中序遍历右子树
}
}
void PostOrder(BTNode *b)
{
if(b!=NULL)
{
PostOrder(b->lchild);//后序遍历左子树
PostOrder(b->rchild);//后序遍历右子树
printf("%c ",b->data);//访问根结点
}
}
遍历二叉树,输出结点值大于C的结点,小于等于C的用*替代
//======递归遍历算法(对二叉树中每个结点调用Visit函数)
void PreOrderTraverse(BTNode *b,Status(* Visit)(ElemType e))
{
if (b!=NULL)
{
Visit(b->data); //访问根节点
PreOrderTraverse(b->lchild,Visit);
PreOrderTraverse(b->rchild,Visit);
}
}//PreOrderTraverse先序遍历,递归
void InOrderTraverse(BTNode *b,Status(* Visit)(ElemType e))
{
if (b!=NULL)
{
InOrderTraverse(b->lchild,Visit);
Visit(b->data); //访问根节点
InOrderTraverse(b->rchild,Visit);
}
}//InOrderTraverse中序遍历,递归
void PostOrderTraverse(BTNode *b,Status(* Visit)(ElemType e))
{
if (b!=NULL)
{
InOrderTraverse(b->lchild,Visit);
InOrderTraverse(b->rchild,Visit);
Visit(b->data); //访问根节点
}
}//PostOrderTraverse后序遍历,递归
② 在“main.cpp”里,主函数main()前面,补全函数DispLargeThanC,DispLessThanD
③ Status DispLargeThanC(ElemType e)//该函数输出树中大于C的字符,请补全代码
{
if(e>'D')
{
printf("%c ",e);
}
else
{
printf("%c ",'*');
}
}
④
Status DispLessThanD(ElemType e)//该函数输出树中小于D的字符,请补全代码
{
if(e<'D')
{
printf("%c ",e);
}
else
{
printf("%c ",'*');
}
}
最终运行截图: