二叉树的三种遍历

二叉树的三种遍历
设计思路:
递归实现二叉树的遍历,先定义一方法,该方法以一定的顺序访问当前方法及其子树,若左子节点为空则终止对左子节点的访问,否则递归访问左子节点;若右子节点为空则终止对右子节点的访问,则递归访问右子节点;若都为空则访问当前结点即可。对于前序遍历,我们只需要在递归方法中以“当前结点–>左子树–>右子树”的顺序进行访问即可;对于中序遍历,遍历顺序则为“左子树–>当前结点–>右子树”;对于后序遍历则为“左子树–>右子树–>当前结点”。
运行结果截图:

在这里插入图片描述

源代码:

#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()
{
    printf("请输入字符串:\n");
	BiTree T = Create();
	printf("前序遍历:");   Preorder(T);   printf("\n");
	printf("中序遍历:");    Inorder(T);    printf("\n");
	printf("后序遍历:");  Postorder(T);  printf("\n");
	printf("结点=%d\n", count(T));
	count1(T);
	printf("%d_结点\n", sum);
	printf("2结点=%d\n", count2(T));
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值