二叉树遍历

来源:互联网 发布:产业地产盈利 知乎 编辑:程序博客网 时间:2024/06/02 04:51



总结:如果根据先序和中序求后序?

      第一步: 先序判断根节点,第一个出现的是根

      第二步:根据中序判断左右,在根节点坐标的是左子树,在根节点右边的是右子树

      第三步:再分别分析左子树和右子树,子树在先序中第一个出现的节点为下一个子节点,

           之后循环第二、三步


现用代码做一个示例:

假设有以下一个二叉树:


根据此二叉树编写一个程序遍历该二叉树:

#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;}