遍历二叉树:按照某条搜索路径访问树中的每个节点,使每个节点均被访问且只被访问一次。遍历的实质是对二叉树进行线性化的过程 ,即遍历的结果将非线性结构的节点变为线性序列。
限定遍历的顺序先左后右,用L表示左子树,R表示右子树,D表示根,则二叉树的遍历方式分前序遍历DLR,中序遍历LDR,后序遍历LRD三种。
PS:根节点的位置决定遍历是什么顺序。先遍历根节点即前序遍历,最后遍历根节点即为后序遍历
三种遍历方式代码如下(递归方式):
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef char ElemType;
//二叉树的二叉链表结构,也就是二叉树的存储结构,1个数据域,2个指针域(左右孩子)
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
//二叉树的建立
void CreateBiTree(BiTree *T)
{
ElemType ch;
*T = (BiTree)malloc(sizeof(BiTNode));
(*T)->data = ch;//生成结点
CreateBiTree(&(*T)->lchild);//构造左子树
CreateBiTree(&(*T)->rchild);//构造右子树
}
//递归方式前序遍历二叉树
void PreOrderTraverse(BiTree T)
{
if (T == NULL)
{
cout<<T->data;//访问根节点
PreOrderTraverse(T->lchild);//前序遍历左子树
PreOrderTraverse(T->rchild);//前序遍历右子树
}
}
//递归方式中序遍历二叉树
void InOrderTraverse(BiTree T)
{
if(T==NULL)
{
InOrderTraverse(T->lchild);//中序遍历左子树
cout<<T->data;//访问根节点
InOrderTraverse(T->rchild);//中序遍历右子树
}
}
//递归方式后序遍历二叉树
void PostOrderTraverse(BiTree T)
{
if(T==NULL)
{
PostOrderTraverse(T->lchild);//后序遍历左子树
PostOrderTraverse(T->rchild);//后序遍历右子树
cout<<T->data;//访问根节点
}
}
int main()
{
BiTree T = NULL;
cout << "请输入二叉树:"; //类似输入AB#D##C##
CreateBiTree(&T);// 建立二叉树
cout << "递归前序遍历输出为:" << endl;
PreOrderTraverse(T);
cout << "递归中序遍历输出为:" << endl;
InOrderTraverse(T);
cout << "递归后序遍历输出为:" << endl;
PostOrderTraverse(T);
return 0;
}
若要添加输出层数等信息,可在PreOrderTraverse(T)函数, InOrderTraverse(T)函数和PostOrderTraverse(T)函数中自行添加语句实现
例:遍历二叉树时同时输出节点的层数(以下代码转载自https://www.cnblogs.com/liuamin/p/6269950.html)
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef char ElemType;