二叉树的三种遍历(C实现)

本文详细介绍了如何使用C语言实现二叉树的前序、中序和后序遍历。通过递归和非递归两种方法,详细解释了遍历过程,帮助读者深入理解二叉树的遍历操作。

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

这是那棵树

#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct BiTNode
{
	ElemType data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
BiTree Create()
{
	ElemType ch;
	BiTree T;
	scanf("%c", &ch);
	if (ch == '#') return NULL;
	T = (BiTree)malloc(sizeof(struct BiTNode));
	T->data = ch;
	T->lchild = Create();
	T->rchild = Create();
	return T;
}
void Preorder(BiTree T)//先序
{
	if (T)
	{
		printf("%c", T->data);
		Preorder(T->lchild);
		Preorder(T->rchild);
	}
}
void Inorder(BiTree T)//中序
{
	if (T)
	{
		Inorder(T->lchild);
		//cout << T->data;
		printf("%c", T->data);
		Inorder(T->rchild);
	}
}
void Postorder(BiTree T)//后序
{
	if (T)
	{
		Postorder(T->lchild);
		Postorder(T->rchild);
		printf("%c", T->data);
		//cout << T->data;
	}
}

//输出结点数
int count(BiTree T)
{
	if (!T) return 0;//空树,0个结点
	return count(T->lchild) + count(T->rchild) + 1;//不是空树至少有1个结点
}
int sum = 0;//全局变量求节点数
void count1(BiTree T)
{
	if (T)//不是空树就继续遍历
	{
		sum++;
		count1(T->lchild);
		count1(T->rchild);
	}
}
int count2(BiTree T)//同上改为局部变量
{
	int count = 0;
	if (T)
	{
		count = 1;
		count += count2(T->lchild);
		count += count2(T->rchild);
	}
	return count;
}
//求层数
int depth(BiTree T)
{
	if (T)
	{
		int ld = depth(T->lchild);
		int rd = depth(T->rchild);
		return ld > rd ? ld + 1 : rd + 1;
	}
	return 0;
}
//某层的结点(先序)调顺序改变输出位置
void traverse(BiTree T, int level, int now)
{
	if (T)
	{
		if (now == level) printf("%c", T->data);
		traverse(T->lchild, level, now + 1);//下一层,加一
		traverse(T->rchild, level, now + 1);
	}
}
int main()
{
	BiTree T = Create();
	printf("Preorder:");   Preorder(T);   printf("\n");
	printf("Inorder:");    Inorder(T);    printf("\n");
	printf("Postorder:");  Postorder(T);  printf("\n");
	printf("结点=%d\n", count(T));
	count1(T);
	printf("%d_结点\n", sum);
	printf("2结点=%d\n", count2(T));
	return 0;
}
//样例
//ABC##DE#G##F###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值