首先你要学会创建一棵二叉树,可以参考我的这篇文章【数据结构】【C/C++】创建二叉树-链式存储-C和C++双语教学
其次,你要知道什么叫做先序中序和后序遍历,可以参考这篇文章【数据结构】理解二叉树的三种遍历–前序、中序、后序 +层序(简明易懂)
知道了这些后,我们来一起看看二叉树先序中序和后序遍历的实现代码!
非递归方法请关注下一篇
解析
还记得我们上一篇中说的么?【数据结构】理解二叉树的三种遍历–前序、中序、后序 +层序(简明易懂)
递归算法中不管是先序中序还是后序,遍历结点时,都先往左孩子走,再往右孩子走, 按照下图这个顺序。
我们用代码实现一下这个顺序
void TraverseBiTree(BiTree T)
{
if (T == NULL)
return ;
TraverseBiTree(T->lChild);
TraverseBiTree(T->rChlid);
}
这个递归就能实现当遇到空指针时候返回,每个结点先往左孩子走,再往右孩子走这个顺序。
如果我们想实现先序遍历,只需要在第一次经过这个结点的时候访问(输出)他就可以了,只需要加上一句printf。
//先序遍历二叉树
void TraverseBiTree(BiTree T)
{
if (T == NULL)
return ;
printf("%c ", T->data);
TraverseBiTree(T->lChild);
TraverseBiTree(T->rChlid);
}
中序遍历,就是在第二次经过这个结点的时候访问它。
//中序遍历二叉树
void InOrderBiTree(BiTree T)
{
if (T == NULL)
return ;
InOrderBiTree(T->lChild);
printf("%c ", T->data);
InOrderBiTree(T->rChlid);
}
后序遍历,就是在第三次经过这个结点的时候访问它。
//后序遍历二叉树
void PostOrderBiTree(BiTree T)
{
if (T == NULL)
return ;
PostOrderBiTree(T->lChild);
PostOrderBiTree(T->rChlid);
printf("%c ", T->data);
}
我们可以看到,差别仅仅是printf出现的位置,也就是我们访问结点的位置,在递归算法中其他并没有差别,很简单吧。
完整代码
1、C语言实现
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef char ElemType; //数据类型
//定义二叉树结构
typedef struct BiTreeNode
{
ElemType data; //数据域
struct BiTreeNode *lChild;
struct BiTreeNode *rChlid;
} BiTreeNode, *BiTree;
//先序创建二叉树
void CreateBiTree(BiTree *T)//要改变指针,所以要把指针的地址传进来
{
ElemType ch;
scanf("%c", &ch);//注意数据类型
getchar();//吸收空格或者回车
if (ch == '#')
*T = NULL;
else
{
*T = (BiTree)malloc(sizeof(BiTreeNode));
if (!(*T))//检查是否分配成功
exit(-1);
(*T)->data = ch;
CreateBiTree(&(*T)->lChild);//printf("输入%d的左孩子:", ch);
CreateBiTree(&(*T)->rChlid);//printf("输入%d的右孩子:", ch);
}
}
//先序遍历二叉树
void TraverseBiTree(BiTree T)
{
if (T == NULL)
return ;
printf("%c ", T->data);
TraverseBiTree(T->lChild);
TraverseBiTree(T->rChlid);
}
//中序遍历二叉树
void InOrderBiTree(BiTree T)
{
if (T == NULL)
return ;
InOrderBiTree(T->lChild);
printf("%c ", T->data);
InOrderBiTree(T->rChlid);
}
//后序遍历二叉树
void PostOrderBiTree(BiTree T)
{
if (T == NULL)
return ;
PostOrderBiTree(T->lChild);
PostOrderBiTree(T->rChlid);
printf("%c ", T->data);
}
//主函数
int main(void)
{
BiTree T;
printf("请输入先序遍历顺序下各个结点的值,#表示没有结点:\n");
CreateBiTree(&T);
printf("先序遍历二叉树:\n");
TraverseBiTree(T);
printf("\n");
printf("中序遍历二叉树:\n");
InOrderBiTree(T);
printf("\n");
printf("后序遍历二叉树:\n");
PostOrderBiTree(T);
printf("\n");
return 0;
}
以这棵树为例
输入:A B D H # # I # # E # J # # C F # K # # G # #
输出:
2、C++语言实现
#include<iostream>
using namespace std;
typedef char ElemType; //数据类型
typedef struct BiTreeNode//定义结构体
{
ElemType data; //数据域
struct BiTreeNode *lChild;//左孩子
struct BiTreeNode *rChlid;//右孩子
} BiTreeNode, *BiTree;
//先序创建二叉树
void CreateBiTree(BiTree &T)//要改变指针,C++可以把指针的引用传进来
{
ElemType ch;
cin >> ch;
if (ch == '#')
T = NULL;
else
{
T = new BiTreeNode;
T->data = ch;
CreateBiTree(T->lChild);//cout<<"输入"<<ch<<"的左孩子:" ;
CreateBiTree(T->rChlid);//cout<<"输入"<<ch<<"的右孩子:" ;
}
}
//先序遍历二叉树
void TraverseBiTree(BiTree T)
{
if (T == NULL)
return ;
cout << T->data <<" ";
TraverseBiTree(T->lChild);
TraverseBiTree(T->rChlid);
}
//中序遍历二叉树
void InOrderBiTree(BiTree T)
{
if (T == NULL)
return ;
InOrderBiTree(T->lChild);
cout << T->data <<" ";
InOrderBiTree(T->rChlid);
}
//后序遍历二叉树
void PostOrderBiTree(BiTree T)
{
if (T == NULL)
return ;
PostOrderBiTree(T->lChild);
PostOrderBiTree(T->rChlid);
cout << T->data <<" ";
}
int main(void)
{
BiTree T;
cout << "请输入先序遍历顺序下各个结点的值,#表示没有结点:" << endl;
CreateBiTree(T);
cout<<"先序遍历二叉树:"<<endl;
TraverseBiTree(T);
cout<<endl;
cout<<"中序遍历二叉树:"<<endl;
InOrderBiTree(T);
cout<<endl;
cout<<"后序遍历二叉树:"<<endl;
PostOrderBiTree(T);
cout<<endl;
return 0;
}
输入输出同上