遍历的定义:
指按某种搜索路径遍历每个结点且不重复(又称周游)
遍历的用途:
它是树结构插入,删除,修改,查找和排列运算的前提,是二叉树的一切运算的基础和核心。
遍历的实质:
将非线性结构线性化。
二叉树的遍历可分为三种。
1.先序遍历。
2.中序遍历。
3.后序遍历
1).先序遍历
若二叉树为空,则空操作;
否则:
- 先访问根结点(D)
- 先序遍历左子树(L)
- 先序遍历右子树(R)
void DLR(BiTree T){
if(T){
printf(T->data);
DLR(T->lchild);
DLR(T->rchild);
}
}
2).中序遍历
若二叉树为空,则空操作;
否则:
- 中序遍历左子树(L)
- 访问根节点(D)
- 中序遍历右子树(R)
void LDR (BiTree T){
if(T){
LDR(T->lchild);
printf(T->data);
LDR(T->rchild);
}
}
3).后序遍历
若二叉树为空,则空操作;
否则:
- 后序遍历左子树(L)
- 后序遍历右子树(R)
- 访问根节点(D)
void LRD(BiTree T){
if(T){
LRD(T->lchild);
LRD(T->rchild);
printf(T->data);
}
}
遍历实验相关代码:
#include<stdio.h>
#include<stdlib.h>
#define MAX 9
using namespace std;
typedef struct node
{
char data;
struct node *lchild;
struct node *rchild;
}BiTNode,*BiTree;
typedef struct BiTNode_s
{
char data;
int lchild;
int rchild;
}BiTNode_s,*BiTree_s;
int i=1;
void PreCreatBiTree(BiTree&T)
{
char ch;
if((ch=getchar())=='*')
T=NULL;
else
{
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=ch;
PreCreatBiTree(T->lchild);
PreCreatBiTree(T->rchild);
}
}
///前序遍历,中左右
void PreTravel(BiTree &T)
{
if(T)
{
printf("%c ",T->data);
PreTravel(T->lchild);
PreTravel(T->rchild);
}
}
///中序遍历,左中右
void MidTravel(BiTree&T)
{
if(T)
{
MidTravel(T->lchild);
printf("%c ",T->data);
MidTravel(T->rchild);
}
}
///后序遍历,左右中
void AftTravel(BiTree &T)
{
if(T)
{
AftTravel(T->lchild);
AftTravel(T->rchild);
printf("%c ",T->data);
}
}
int main()
{
int j;
BiTree T;
BiTNode_s a[MAX];
printf("请按先序遍历顺序输入二叉树的各节点,没有的用符号*代替:\n");
PreCreatBiTree(T);
printf("前序遍历结果:\n");
PreTravel(T);
printf("\n");
printf("中序遍历结果:\n");
MidTravel(T);
printf("\n");
printf("后序遍历结果:\n");
AftTravel(T);
printf("\n");
return 0;
}