总结:如果根据先序和中序求后序?
第一步: 先序判断根节点,第一个出现的是根
第二步:根据中序判断左右,在根节点坐标的是左子树,在根节点右边的是右子树
第三步:再分别分析左子树和右子树,子树在先序中第一个出现的节点为下一个子节点,
之后循环第二、三步
现用代码做一个示例:
假设有以下一个二叉树:
根据此二叉树编写一个程序遍历该二叉树:
#include <iostream>
using namespace std;
struct BNode //节点
{
char data; //存放数据
struct BNode* pLChild; //左子树
struct BNode* pRChild; //右子树
};
//创建二叉树
struct BNode* CreateBTree()
{
//先创建五个节点
struct BNode *pA=new struct BNode();
struct BNode *pB=new struct BNode();
struct BNode *pC=new struct BNode();
struct BNode *pD=new struct BNode();
struct BNode *pE=new struct BNode();
//指定各节点左右子树
pA->pLChild=pB;
pA->pRChild=pC;
pB->pLChild=pB->pRChild=NULL;
pC->pLChild=pD;
pC->pRChild=NULL;
pD->pLChild=NULL;
pD->pRChild=pE;
pE->pLChild=pE->pRChild=NULL;
//各节点保存数据
pA->data='A';
pB->data='B';
pC->data='C';
pD->data='D';
pE->data='E';
return pA; //返回根节点
}
//先序遍历
void PreTraverserBTree(struct BNode *pT)
{
/*****************
*伪算法
*1.先访问根节点
*2.再先序访问左子树
*3.再先序访问右子树
*/
if(pT!=NULL)
{
//1.先访问根节点
cout<<pT->data<<endl;
if(pT->pLChild!=NULL)
{
//2.再先序访问左子树(pTLChild可以代表整个左子树)
PreTraverserBTree(pT->pLChild);
}
if(pT->pRChild!=NULL)
{
//3.再先序访问右子树(pTRChild可以代表整个右子树)
PreTraverserBTree(pT->pRChild);
}
}
}
//中序遍历
void MidTraverserBTree(struct BNode *pT)
{
if(pT!=NULL)
{
if(pT->pLChild!=NULL)
{
//1.先中序访问左子树(pTLChild可以代表整个左子树)
MidTraverserBTree(pT->pLChild);
}
//2.再访问根节点
cout<<pT->data<<endl;
if(pT->pRChild!=NULL)
{
//3.再中序访问右子树(pTRChild可以代表整个右子树)
MidTraverserBTree(pT->pRChild);
}
}
}
//后序遍历
void BackTraverserBTree(struct BNode *pT)
{
if(pT!=NULL)
{
if(pT->pLChild!=NULL)
{
//1.先后序访问左子树(pTLChild可以代表整个左子树)
BackTraverserBTree(pT->pLChild);
}
if(pT->pRChild!=NULL)
{
//2.再后序访问右子树(pTRChild可以代表整个右子树)
BackTraverserBTree(pT->pRChild);
}
//3.再访问根节点
cout<<pT->data<<endl;
}
}
int main()
{
struct BNode *pT=CreateBTree();
//PreTraverserBTree(pT);
//MidTraverserBTree(pT);
BackTraverserBTree(pT);
system("pause");
return 0;
}