2018年数据结构实验之二叉树的遍历

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;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值