二叉树遍历,路径,查看某层(邻接表写法)

本文介绍了一个使用C语言实现的二叉树数据结构及其基本操作,包括创建、多种遍历方式(先序、中序、后序、层序遍历)以及查找指定节点路径的方法。通过命令行菜单形式,用户可以灵活地进行二叉树的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define OVERFLOW  0
#define max 50
typedef struct
{
	char a[max];
	int top;
}seqstack;
seqstack *s=(seqstack *)malloc(sizeof(seqstack));              /*建立栈*/ 
typedef struct Bitree                                         /*结构体存放结点信息以及左右孩子结点指针*/ 
{
	char data;
	struct Bitree *lchild;
	struct Bitree *rchild;
	
}Bitree,*Binarytree;
void initstack(seqstack *s)                                    /*初始化栈*/ 
{
	s->top=-1;
} 
int push(seqstack *s,char x)                                /*入栈*/ 
{
	if(s->top==max-1)return 0;
	s->top++;
	s->a[s->top]=x;
	return 1;
	
}
int pop(seqstack *s)                                        /*出栈*/
{
	if(s->top==-1)return 0;
	else
	{s->top--;
	return 1;
	}
}
int createbitree(Binarytree *T)                                /*构造二叉树*/
{
    char ch;
    *T=(Binarytree)malloc(sizeof(Bitree));
    if(!(*T))                                        
        exit(OVERFLOW);
    scanf("%c",&ch);
    if(ch=='0')                                          /*输入为0时不建立新结点*/
        *T=NULL;
    else                                                    
    {
        (*T)->data=ch;                                      /*输入不为0时建立新结点*/ 
        createbitree(&((*T)->lchild));                     /*递归建立左子树和右子树*/ 
        createbitree(&((*T)->rchild));
    }
    return OK;
}
int preshowbitree(Binarytree T)                         /*先序遍历*/ 
{
	if(T!=NULL)
	{
		printf("%c ",T->data);                        /*该结点不为空时打印*/ 
		preshowbitree(T->lchild);                      /*递归遍历左子树*/ 
		preshowbitree(T->rchild);                       /*递归遍历右子树*/
	}
	return OK;
}
int midshowbitree(Binarytree T)                      
{
	if(T!=NULL)                                       
	{
		midshowbitree(T->lchild);                        /*递归遍历左子树*/                 
		printf("%c ",T->data);                          /*该结点不为空时打印*/
		midshowbitree(T->rchild);                        /*递归遍历右子树*/ 
	}
	return OK;
	
}
int behshowbitree(Binarytree T)
{
	if(T!=NULL)
	{
		behshowbitree(T->lchild);                         /*递归遍历左子树*/  
		behshowbitree(T->rchild);                             /*递归遍历右子树*/
		printf("%c ",T->data);                             /*该结点不为空时打印*/
	}
	return OK;
}
int layershowbitree(Binarytree T,int nowlayer,int layer)    /*层序遍历*/
{
	if(T!=NULL)
	{
		if(nowlayer==layer)                                 /*当结点在所求的层数时打印该结点*/ 
		printf("%c ",T->data);
		layershowbitree(T->lchild,nowlayer+1,layer);        /*递归遍历左子树*/ 
		layershowbitree(T->rchild,nowlayer+1,layer);        /*递归遍历右子树*/ 
	}
	return OK;
}
void findpath(Binarytree T,seqstack *s,char x)             /*寻找从根结点到所求结点的路径*/ 
{
	if(T==NULL)return;                                      
	push(s,T->data);                                       /*遍历到某结点将结点数据入栈*/ 
	if(T->data==x)                                         /*如果该结点为所求结点,则打印栈中的数据并退出程序*/ 
	{
		for(int i=0;i<=s->top;i++)      
		printf("%c ",s->a[i]);
		exit(0);
	}
	findpath(T->lchild,s,x);                            /*遍历左子树寻找所求结点*/ 
	findpath(T->rchild,s,x);                            /*遍历右子树寻找所求结点*/ 
	pop(s);                                              /*左右子树中都没有该结点,将该结点出栈,返回上一层*/ 
	
}

int main()
{
	int m;
	printf("菜单:\n"); 
	printf("1.建立二叉树存储结构\n2.求二叉树的先序遍历序列\n3.求二叉树的中序遍历序列\n4.求二叉树的后序遍历序列\n5.求二叉树的层序遍历序列\n6.求根结点到指定结点的路径\n0.退出\n请选择:\n"); 
	Bitree *T=NULL;
	while(scanf("%d",&m)&&m)
	{
	fflush(stdin);
	switch(m)
	{
		case 0:exit(0);
		case 1:
			printf("请按照先序遍历输入二叉树:\n");
			createbitree(&T);
			printf("二叉树建立完成"); 
			break;
		case 2:
			printf("二叉树的先序遍历序列为:\n");
			preshowbitree(T);
			break;
			
		case 3:
			printf("二叉树的中序遍历序列为:\n");
			midshowbitree(T);
			break;
		case 4:
			printf("二叉树的后序遍历序列为:\n");
			behshowbitree(T);
			break;
		case 5:
			printf("请输入要查看的层数:\n");
			int l;
			scanf("%d",&l);
			printf("第%d层的结点有:\n",l); 
			layershowbitree(T,1,l);
			break;
		case 6:
			printf("请输入要查看的结点:\n"); 
			fflush(stdin);
			char e;
			scanf("%c",&e);
			initstack(s);
			printf("路径为:\n"); 
			findpath(T,s,e); 
			break;
		default:printf("输入错误");break; 
	}
	printf("\n"); 
	}
	return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值