数据结构-前序,中序 后续序历算法(c语言)

本文详细介绍了二叉树的前序、中序和后序遍历算法,并通过具体实例展示了每种遍历方式的过程及输出结果,有助于理解二叉树的基本操作。

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//二叉链表示法
typedef struct BiTNode
{
	int data;//数据域
	struct BiTNode *lchild;//指针域,存放指向左孩子的指针
	struct BiTNode *rchild;//指针域,存放指向右孩子的指针
}BiTNode, *BiTree;
/*

调用preOrder(t1),t1是根结点,不为NULL,执行printf("%d\t",root->data);打印出来1
调用preOrder(root->lchild);访问了根节点(t1)的左孩子(t2),不为NULL,执行printf("%d\t",root->data);打印出来2
递归调用preOrder(root->lchild);访问了t2结点的左孩子(t4),不为NULL,执行printf("%d\t",root->data);打印出来4
递归调用preOrder(root->lchild);访问了t4结点的左孩子,为NULL,返回此函数,此时递归调用preOrder(root->rchild);访问t4的右孩子,发现还是为NULL,于是函数执行完毕,返回上一级递归的函数
也就是(打印t2结点函数),调用preOrder(root->rchild);访问t2的右孩子,为NULL,在返回到上一级递归函数(打印根节点t1函数),调用preOrder(root->rchild);访问根节点的右孩子
也就是t3,不为NULL,故执行printf("%d\t",root->data);打印出来3,递归调用preOrder(root->lchild);访问了t3结点的左孩子(t5),不为NULL,执行printf("%d\t",root->data);打印出来5
调用preOrder(root->lchild);访问t5的左孩子,为NULL,在返回到上一级递归函数(打印根节点t3函数),
调用preOrder(root->rchild);访问t3的右孩子,为NULL,在返回到上一级递归函数(打印根节点t1函数)
之后所以递归函数调用结束,前序遍历算法函数调用结束
*/
void preOrder(BiTNode *root)
{
	if (NULL == root)
	{
		return;
	}

	printf("%d\t",root->data);

	//遍历左子树
	preOrder(root->lchild);

	//遍历右子树
	preOrder(root->rchild);

}
int main()
{
	//创建节点
	BiTNode t1, t2, t3, t4, t5;
	memset(&t1,0,sizeof(BiTNode));
	memset(&t2, 0, sizeof(BiTNode));
	memset(&t3, 0, sizeof(BiTNode));
	memset(&t4, 0, sizeof(BiTNode));
	memset(&t5, 0, sizeof(BiTNode));

	t1.data = 1;
	t2.data = 2;
	t3.data = 3;
	t4.data = 4;
	t5.data = 5;

	//建立联系
	t1.lchild = &t2;
	t1.rchild = &t3;
	t2.lchild = &t4;
	t3.lchild = &t5;

	//树的遍历
	//前序遍历算法
	printf("preOrder\n");
	preOrder(&t1);

	system("pause");
	return 0;
}

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//二叉链表示法
typedef struct BiTNode
{
	char data;//数据域
	struct BiTNode *lchild;//指针域,存放指向左孩子的指针
	struct BiTNode *rchild;//指针域,存放指向右孩子的指针
}BiTNode, *BiTree;
/*

调用preOrder(t1),t1是根结点,不为NULL,执行printf("%d\t",root->data);打印出来1
调用preOrder(root->lchild);访问了根节点(t1)的左孩子(t2),不为NULL,执行printf("%d\t",root->data);打印出来2
递归调用preOrder(root->lchild);访问了t2结点的左孩子(t4),不为NULL,执行printf("%d\t",root->data);打印出来4
递归调用preOrder(root->lchild);访问了t4结点的左孩子,为NULL,返回此函数,此时递归调用preOrder(root->rchild);访问t4的右孩子,发现还是为NULL,于是函数执行完毕,返回上一级递归的函数
也就是(打印t2结点函数),调用preOrder(root->rchild);访问t2的右孩子,为NULL,在返回到上一级递归函数(打印根节点t1函数),调用preOrder(root->rchild);访问根节点的右孩子
也就是t3,不为NULL,故执行printf("%d\t",root->data);打印出来3,递归调用preOrder(root->lchild);访问了t3结点的左孩子(t5),不为NULL,执行printf("%d\t",root->data);打印出来5
调用preOrder(root->lchild);访问t5的左孩子,为NULL,在返回到上一级递归函数(打印根节点t3函数),
调用preOrder(root->rchild);访问t3的右孩子,为NULL,在返回到上一级递归函数(打印根节点t1函数)
之后所以递归函数调用结束,前序遍历算法函数调用结束
*/
void preOrder(BiTNode *root)
{
	if (NULL == root)
	{
		return;
	}

	printf("%c\t",root->data);

	//遍历左子树
	preOrder(root->lchild);

	//遍历右子树
	preOrder(root->rchild);

}
/*
中序遍历算法
调用inOrder(A),根节点不为NULL,于是调用inOrder(root->lchild);继续调用inOrder(B),访问B,当前指针不为NULL,
继续调用inOrder(D),不为NULL,继续调用inOrder(root->lchild);访问H,H不为NULL,继续调用inOrder(root->lchild),H无左孩子,为空,返回上一级递归函数中,执行打印函数	printf("%c\t", root->data);得到H
接着调用inOrder(root->rchild);访问H的右孩子K,发现不为NUL,因为K无左孩子,执行完inOrder(root->lchild);直接执行printf("%c\t", root->data);打印K
因为K无右孩子,所以返回,直接返回到调用函数到字母D,打印D,继续调用inOrder(root->rchild);但是D无右孩子,返回上一级递归函数B,打印B,
之后调用inOrder(root->rchild);访问E,不为NULL,执行完inOrder(root->lchild);因E无左孩子,直接打印出来E,接着访问E的右孩子,发现没有,则返回到根节点位置
打印A,然后继续调用inOrder(root->rchild);访问C,不为NULL,调用inOrder(root->lchild);访问F,不为NULL,继续inOrder(root->lchild);访问I
I不为NULL,继续调用inOrder(root->lchild);因为I没有左孩子,返回到I,打印I,继续调用inOrder(root->rchild);发现I无右孩子
返回到F,打印F,F无右孩子,返回到C,打印C,接着调用inOrder(root->rchild);访问G,G不为NULL,调用inOrder(root->lchild);因G无左孩子,打印G,继续调用inOrder(root->rchild);访问J,因为J无左孩子,直接打印J,无右孩子,返回,递归调用结束


*/
//先左子树 然后根 最后右子树
void inOrder(BiTNode *root)
{
	if (NULL == root)
	{
		return;
	}


	//遍历左子树
	inOrder(root->lchild);

	printf("%c\t", root->data);

	//遍历右子树
	inOrder(root->rchild);

}

//先左子树-右子树-根
void postOrder(BiTNode *root)
{
	if (NULL == root)
	{
		return;
	}


	//遍历左子树
	postOrder(root->lchild);



	//遍历右子树
	postOrder(root->rchild);

	printf("%c\t", root->data);
}
int main()
{
	//创建节点
	BiTNode A, B, C, D, E,F,G,H,I,J,K;
	memset(&A,0,sizeof(BiTNode));
	memset(&B, 0, sizeof(BiTNode));
	memset(&C, 0, sizeof(BiTNode));
	memset(&D, 0, sizeof(BiTNode));
	memset(&E, 0, sizeof(BiTNode));
	memset(&F, 0, sizeof(BiTNode));
	memset(&G, 0, sizeof(BiTNode));
	memset(&H, 0, sizeof(BiTNode));
	memset(&I, 0, sizeof(BiTNode));
	memset(&J, 0, sizeof(BiTNode));
	memset(&K, 0, sizeof(BiTNode));

	A.data = 'A';
	B.data = 'B';
	C.data = 'C';
	D.data = 'D';
	E.data = 'E';
	F.data = 'F';
	G.data = 'G';
	H.data = 'H';
	I.data = 'I';
	J.data = 'J';
	K.data = 'K';

	//建立联系
	A.lchild = &B;
	A.rchild = &C;
	B.lchild = &D;
	B.rchild = &E;
	D.lchild = &H;
	H.rchild = &K;

	C.lchild = &F;
	C.rchild = &G;
	F.lchild = &I;
	G.rchild = &J;


	//树的遍历
	//前序遍历算法
	printf("前序遍历算法\n");
	preOrder(&A);

	printf("\n中序遍历算法\n");
	inOrder(&A);

	printf("\n后遍历算法\n");
	postOrder(&A);

	system("pause");
	return 0;

}

口诀:
DLR—先序遍历,即先根再左再右

LDR—中序遍历,即先左再根再右

LRD—后序遍历,即先左再右再根


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值