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

程序运行如下:

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

上一篇:九、考研数据结构笔记——二叉树遍历和线索二叉树构造,常见易错点


下一篇:按先序遍历建立链式存储结构的二叉树,设计算法判断输入的二叉树是否为满二叉树。