【数据结构】-二叉树的先序、中序、后序遍历-递归实现

1.头文件及类型定义

#include<stdio.h>
#include<stdlib.h>
#define ElemType char

2.二叉链表结点类型定义

//二叉树结点类型定义
typedef struct BiTNode {
	ElemType data;		//结点中的数据域
	struct BiTNode* lchild, * rchild;	//左右孩子指针
}BiTNode, * BiTree;

3.函数声明

/*函数声明*/
void CreateBiTree(BiTree& T);	//1.先序建立二叉树
void visit(BiTNode* p);			//2.打印结点值
void PreOrder(BiTree T);		//3.先序遍历	
void InOrder(BiTree T);			//4.中序遍历
void PostOrder(BiTree T);		//5.后序遍历

4.基本操作

4.1 先序建立二叉树

//1.先序建立二叉树
void CreateBiTree(BiTree& T) {
	char c;
	scanf("%c", &c);
	if (c == '#')
		T = NULL;
	else {
		T = (BiTNode*)malloc(sizeof(BiTNode));
		T->data = c;
		CreateBiTree(T->lchild);
		CreateBiTree(T->rchild);
	}
}

4.2 打印结点

//2.打印结点-用于遍历
void visit(BiTNode* p) {
	printf("%c\t", p->data);
}

4.3 先序遍历

//3.先序遍历(根->左->右)
void PreOrder(BiTree T) {
	if (T != NULL) {
		visit(T);				//访问根结点
		PreOrder(T->lchild);	//递归遍历左子树
		PreOrder(T->rchild);	//递归遍历右子树
	}
}

4.4 中序遍历

//4.中序遍历(左->根->右)
void InOrder(BiTree T) {
	if (T != NULL) {
		InOrder(T->lchild);		//递归遍历左子树
		visit(T);				//访问根结点
		InOrder(T->rchild);		//递归遍历右子树
	}
}

4.5 后序遍历

//5.后序遍历(左->右->根)
void PostOrder(BiTree T) {
	if (T != NULL) {
		PostOrder(T->lchild);	//递归遍历左子树
		PostOrder(T->rchild);	//递归遍历右子树
		visit(T);				//访问根结点
	}
}

4.6 main函数

int main() {
	BiTree T;			//声明一个二叉树

	/*1、先序创建二叉树*/
	printf("先序创建二叉树:");
	CreateBiTree(T);	//先序建立二叉树

	/*2、先序遍历二叉树*/
	printf("<————先序遍历————>\n");
	PreOrder(T);

	/*3、中序遍历二叉树*/
	printf("\n<————中序遍历————>\n");
	InOrder(T);

	/*4、后序遍历二叉树*/
	printf("\n<————后序遍历————>\n");
	PostOrder(T);

	return 0;
}

4.7 测试

4.7.1 二叉树结构

在这里插入图片描述

4.7.2 测试结果

RunningSnail

5.小结

二叉树的先序、中序、后序遍历也叫深度优先遍历二叉树的遍历是二叉树的核心操作,以上三种遍历方式是简单易懂的,很多其他操作都是基于这三种操作延伸而来的,需要熟练掌握。本文是基于递归算法实现的,下篇文章将用非递归实现二叉树的遍历。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值