2018年数据结构实验之二叉树的遍历
很简单,理解递归之后,这些东西确实很简单。我记得从哪听过这么一句话“区分计算机专业学生和非计算机专业学生的一个标准是,有没有对递归彻底理解”,到现在感觉的确是这样,如果能认认真真把大作业亲自做完,不懂的问别人,死磕,并没有你想的那么难,希望读者(应该都是学弟学妹吧),还是用用心,好好理解理解递归,很重要,真的很重要!
说实话,个人不很喜欢伪代码,所以学校发的严蔚敏老师的教材我基本没怎么看过…这里没有别的意思,单纯是我自己太菜,对伪代码不太感冒…
直接贴代码了
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include"stdlib.h"
#define MAXSIZE 100
typedef struct node{
char data; //数据域
struct node *lchild , *rchild; //左右孩子指针
}BinTNode, *BinTree; //树中结点类型
int book=0;
int bok=0;
void print()
{
printf("***************************************\n");
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");
printf("----------------------------------\n");
printf(" 请输入你要选择的功能:");
}
void CreateBinTree(BinTree &T,int num,char c)
{
//按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
if(num==1)
printf("请输入%c的左孩子,#代表空:",c);
else if(num==2)
printf("请输入%c的右孩子,#代表空:",c);
char ch;
ch=getch();
printf("%c",ch);
printf("\n");
if(ch=='#'){
T=NULL;
} //递归结束,建空树
else
{
T=new BinTNode;
T->data=ch; //生成根结点
CreateBinTree(T->lchild,1,T->data); //递归创建左子树
CreateBinTree(T->rchild,2,T->data); //递归创建右子树
} //else
}
void InOrderTraverse(BinTree &T)
{
//先序遍历二叉树T的递归算法
if(T)
{
printf("%c",T->data);
InOrderTraverse(T->lchild);
InOrderTraverse(T->rchild);
}
}
void MidOrderTraverse(BinTree &T)
{
//中序遍历二叉树T的递归算法
if(T)
{
MidOrderTraverse(T->lchild);
printf("%c",T->data);
MidOrderTraverse(T->rchild);
}
}
void LastOrderTraverse(BinTree &T)
{
//中序遍历二叉树T的递归算法
if(T)
{
LastOrderTraverse(T->lchild);
LastOrderTraverse(T->rchild);
printf("%c",T->data);
}
}
void levelOrder(BinTree &T)
{
if(T==NULL)
return;
BinTree s[MAXSIZE];
int fron, rear;
fron = rear = -1; // 采用顺序队列,并假定不会发生溢出
s[++rear] = T;
while(fron != rear)
{
BinTree q = s[++fron];
printf("%c",q->data);
if (q->lchild)
s[++rear] = q->lchild;
if (q->rchild)
s[++rear] = q->rchild;
}
}
void fine(BinTree &T,char k)
{
if(T!=NULL){
if(T->data==k){
bok++;
fine(T->lchild,k);
fine(T->rchild,k);
}
else{
fine(T->lchild,k);
fine(T->rchild,k);
}
}
}
void printPaths(BinTree &T,char path[],char k,int &pathlen)
{
if(T!= NULL)
{
if(T->data==k)
{
for(int i=0;i<=pathlen-1;i++)
printf("%c->",path[i]);
printf("%c",T->data);
printf("\n");
path[pathlen]=T->data;
pathlen++;
printPaths(T->lchild,path,k,pathlen);
printPaths(T->rchild,path,k,pathlen);
pathlen--;
}
if(T->data!=k)
{
path[pathlen]=T->data;
pathlen++;
printPaths(T->lchild,path,k,pathlen);
printPaths(T->rchild,path,k,pathlen);
pathlen--;
}
}
}
void printPath(BinTree &T,char path[],char k,int &pathlen)
{
if(T!= NULL)
{
if(T->data==k)
{
for(int i=0;i<=pathlen-1;i++)
printf("%c->",path[i]);
printf("%c",T->data);
printf("\n");
}
else
{
path[pathlen]=T->data;
pathlen++;
printPath(T->lchild,path,k,pathlen);
printPath(T->rchild,path,k,pathlen);
pathlen--;
}
}
}
int main( )
{
///ABC##DE#G##F###
BinTree tree;
while(1)
{
bok=0;
int number;
print();
char c=getch();
printf("%c",c);
if(c>'6'||c<'0'){
printf("请输入0-6之内的数字!\n");
//getchar();
continue;
}
else
number=c-'0';
if(number==1){
printf("\n请输入你要输入的树序列:\n");
CreateBinTree(tree,0,0);
printf("\n创建树完毕!\n");
InOrderTraverse(tree);
}
else if(number==2){
printf("\n输出先序:");
InOrderTraverse(tree);
printf("\n");
}
else if(number==3){
printf("\n输出中序:");
MidOrderTraverse(tree);
printf("\n");
}
else if(number==4){
printf("\n输出后序:");
LastOrderTraverse(tree);
printf("\n");
}
else if(number==5){
printf("\n输出层序遍历:");
levelOrder(tree);
printf("\n");
}
else if(number==6){
int level=0;
char path[50];
printf("\n请输入要开始的节点:");
char k=getch();
printf("%c",k);
fine(tree,k);
if(bok==1){
printf("\n路径为:");
printPath(tree,path,k,level);
}
else if(bok==0){
printf("并未查找到您所要查找的节点");
}
else{
printf("\n您所要查找的节点在二叉树上有多个\n");
printf("路径分别为:\n");
printPaths(tree,path,k,level);
}
printf("\n");
}
else if(number==0){
book=1;
break;
}
if(book==1)
break;
}
return 0;
}