二叉树的遍历(前序、中序、后序)
所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。
前序遍历:根节点->左子树->右子树(根->左->右)
中序遍历:左子树->根节点->右子树(左->根->右)
后序遍历:左子树->右子树->根节点(左->右->根)
例如:
A、B、C、D、E、F、G、H 也可以用(1、2、3、4、5、6、7、8)表示。
一、前序
前序遍历:根节点->左子树->右子树(根->左->右)
答案:A、B、D、E、G、H、C、F (1、2、4、5、7、8、3、6)
二、中序
中序遍历:左子树->根节点->右子树(左->根->右)
答案:D、B、G、H、E、A、C、F (4、2、7、8、5、1、3、6)
三、后序
后序遍历:左子树->右子树->根节点(左->右->根)
答案:D、H、G、E、B、F、C、A (4、8、7、5、2、6、3、1)
四、代码
#i#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild,*rchild; //左右孩子树
}BiTNode,*BiTree;
//二叉树的建立 按照先序遍历建立
void createBiTree(BiTree *T)
{
char s;
scanf("%c",&s);
if(s=='$')
{
*T=NULL;
}
else
{
*T=(BiTNode*)malloc(sizeof(BiTNode)); //生成结点
if(!(*T))
{
printf("申请空间失败\n");
}
(*T)->data=s;
createBiTree(&(*T)->lchild);
createBiTree(&(*T)->rchild);
}
}
//二叉树前序遍历
void preorderVisit(BiTree T) //这里不要使用BiTNode *T , 不要直接对树进行操作
{
if(T) //先要进行判断,只有结点不为空才会遍历
{
printf("%c ",T->data);
preorderVisit(T->lchild);
preorderVisit(T->rchild);
}
}
//二叉树中序遍历
void middleVisit(BiTree T) //这里不要使用BiTNode *T , 不要直接对树进行操作
{
if(T) //先要进行判断,只有结点不为空才会遍历
{
middleVisit(T->lchild);
printf("%c ",T->data);
middleVisit(T->rchild);
}
}
//二叉树后序遍历
void postVisit(BiTree T) //这里不要使用BiTNode *T , 不要直接对树进行操作
{
if(T) //先要进行判断,只有结点不为空才会遍历
{
postVisit(T->lchild);
postVisit(T->rchild);
printf("%c ",T->data);
}
}
int main()
{
printf("请输入二叉树,按照前序遍历,无字树用$号表示\n");
BiTree T;
createBiTree(&T);
printf("前序遍历结果如下:\n");
preorderVisit(T);
printf("\n");
printf("中序遍历结果如下:\n");
middleVisit(T);
printf("\n");
printf("后序遍历结果如下:\n");
postVisit(T);
printf("\n");
}