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