其他分享
首页 > 其他分享> > C语言中序遍历,双序遍历,前序遍历,后序遍历

C语言中序遍历,双序遍历,前序遍历,后序遍历

作者:互联网

前序遍历就是先访问根节点的左子树再前序遍历左子树再遍历右子树

前序遍历算法如下:

void _PrintTree_f2(BiTree a)
{
	if(a)//*如果a不为空
	{
		printf("%c\n",a->data);//*访问根结点
		_PrintTree_f2(a->lchild);//*遍历左子树
		_PrintTree_f2(a->rchild);//*遍历右子树
	}
}

中序遍历就是先中序遍历根节点的右孩子再访问根节点其次中序遍历左孩子

中序遍历算法如下:

void _PrintTree_f4(BiTree a)
{
	if(a)//*如果a不为空
	{
		_PrintTree_f4(a->lchild);//*遍历左子树
		printf("%c\n",a->data);//*访问根结点
		_PrintTree_f4(a->rchild);//*遍历右子树
	}
}

后序遍历就是先后序遍历左孩子,再后序遍历右子树,最后访问根节点

后续遍历算法如下:

void _PrintTree_f3(BiTree a)
{
	if(a)//*如果a不为空
	{
		_PrintTree_f3(a->lchild);//*遍历左子树
		_PrintTree_f3(a->rchild);//*遍历右子树
		printf("%c\n",a->data);//*访问根结点
	}
}

双序遍历就是先访问根节点然后双序遍历左孩子再访问根节点然后双序遍历右孩子

中序遍历算法如下:

void _PrintTree_f1(BiTree a)
{
	if(a)//*如果a不为空
	{
		printf("%c\n",a->data);//*访问根结点
		_PrintTree_f1(a->lchild);//*遍历左子树
		printf("%c\n",a->data);//*访问根结点
		_PrintTree_f1(a->rchild);//*遍历右子树
	}
}

完整代码如下:

#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode
{
	char data;
	struct BiTNode *rchild,*lchild;
}*BiTree;
void CreateBiTree(BiTree *a)
{
	char data;
	scanf("%c",&data);
	fflush(stdin);
	if(data=='#')
	{
		*a=NULL;
	}
	else
	{
		*a=(struct BiTNode*)malloc(sizeof(struct BiTNode));
		(*a)->data=data;
		printf("请输入左孩子:\n");
		CreateBiTree(&(*a)->lchild);
		printf("请输入右孩子:\n");
		CreateBiTree(&(*a)->rchild);
	}
}
void _PrintTree_f1(BiTree a)
{
	if(a)//*如果a不为空
	{
		printf("%c\n",a->data);//*访问根结点
		_PrintTree_f1(a->lchild);//*遍历左子树
		printf("%c\n",a->data);//*访问根结点
		_PrintTree_f1(a->rchild);//*遍历右子树
	}
}
void _PrintTree_f2(BiTree a)
{
	if(a)//*如果a不为空
	{
		printf("%c\n",a->data);//*访问根结点
		_PrintTree_f2(a->lchild);//*遍历左子树
		_PrintTree_f2(a->rchild);//*遍历右子树
	}
}
void _PrintTree_f3(BiTree a)
{
	if(a)//*如果a不为空
	{
		_PrintTree_f3(a->lchild);//*遍历左子树
		_PrintTree_f3(a->rchild);//*遍历右子树
		printf("%c\n",a->data);//*访问根结点
	}
}
void _PrintTree_f4(BiTree a)
{
	if(a)//*如果a不为空
	{
		_PrintTree_f4(a->lchild);//*遍历左子树
		printf("%c\n",a->data);//*访问根结点
		_PrintTree_f4(a->rchild);//*遍历右子树
	}
}
void Delete_Tree(BiTree *a)
{
	if(*a)
	{
		Delete_Tree(&(*a)->lchild);
		Delete_Tree(&(*a)->rchild);
		BiTree b;
		b=*a;
		free(b);
	}
}
main()
{
	BiTree a;
	printf("请输入根节点:\n");
	CreateBiTree(&a);
	printf("双序遍历:\n");
	_PrintTree_f1(a);
	printf("中序遍历:\n");
	_PrintTree_f4(a);
	printf("前序遍历:\n");
	_PrintTree_f2(a);
	printf("后序遍历:\n");
	_PrintTree_f3(a);
	Delete_Tree(&a);
	system("pause");
	return 0;
}

程序运行如下:

标签:遍历,BiTree,双序,前序,PrintTree,printf,rchild,data
来源: https://blog.csdn.net/qq_58190943/article/details/121924591