建立二叉樹,先、中、後序遍歷

 

#include <stdio.h>
#include <iostream>
#include <queue>
#include <stack>
#include <malloc.h>
#define SIZE 100

using namespace std;

typedef struct       BiTNode           //定義二叉樹節點結構
{
char       data;                          //數據域
struct BiTNode *lchild,*rchild; //左右孩子指針域
}BiTNode,*BiTree;

int visit(BiTree t);
void CreateBiTree(BiTree &T);         //生成一個二叉樹
void PreOrder(BiTree);               //遞歸先序遍歷二叉樹
void InOrder(BiTree);                //遞歸中序遍歷二叉樹
void PostOrder(BiTree);              //遞歸後序遍歷二叉樹
void InOrderTraverse(BiTree T); //非遞歸中序遍歷二叉樹
void PreOrder_Nonrecursive(BiTree T);//非遞歸先序遍歷二叉樹
void LeverTraverse(BiTree T);//非遞歸層序遍歷二叉樹


//主函數
void main()
{
BiTree T;       
char j;
int flag=1;
//---------------------程序解說-----------------------
printf("本程序實現二叉樹的操作。/n");
printf("葉子結點以空格表示。/n");
printf("可以進行建立二叉樹,遞歸先序、中序、後序遍歷,非遞歸先序、中序遍歷及非遞歸層序遍歷等操作。/n");
//----------------------------------------------------
printf("/n");
printf("請建立二叉樹。/n");
printf("建樹將以三個空格後回車結束。/n");
printf("例如:1 2 3 4 5 6        (回車)/n"); CreateBiTree(T);            //初始化隊列
getchar();
while(flag)
         {
       printf("/n");
       printf("請選擇: /n");
       printf("1.遞歸先序遍歷/n");
       printf("2.遞歸中序遍歷/n");
       printf("3.遞歸後序遍歷/n");
       printf("4.非遞歸中序遍歷/n");
       printf("5.非遞歸先序遍歷/n");
       printf("6.非遞歸層序遍歷/n");
       printf("0.退出程序/n");
       scanf(" %c",&j);
       switch(j)
       {
        case '1':if(T)
                 {
         printf("遞歸先序遍歷二叉樹:");
         PreOrder(T);
         printf("/n");
                  }
        else printf("二叉樹爲空!/n");
        break;
        case '2':if(T)
                 {
         printf("遞歸中序遍歷二叉樹:");
         InOrder(T);
         printf("/n");
                 }
        else printf("二叉樹爲空!/n");
        break;
        case '3':if(T)
                 {
         printf("遞歸後序遍歷二叉樹:");
         PostOrder(T);
         printf("/n");
                 }
        else printf("二叉樹爲空!/n");
        break;
        case '4':if(T)
                 {
         printf("非遞歸中序遍歷二叉樹:");
         InOrderTraverse(T);
         printf("/n");
                 }
        else printf("二叉樹爲空!/n");
        break;
        case '5':if(T)
                 {
         printf("非遞歸先序遍歷二叉樹:");
         PreOrder_Nonrecursive(T);
         printf("/n");
                 }
        else printf("二叉樹爲空!/n");
        break;
        case '6':if(T)
                 {
         printf("非遞歸層序遍歷二叉樹:");
         LeverTraverse(T);
         printf("/n");
                 }
        else printf("二叉樹爲空!/n");
        break;
        default:flag=0;printf("程序運行結束,按任意鍵退出!/n");
       }
         }

}

//建立二叉樹
void CreateBiTree(BiTree &T)
{
char ch;
scanf("%c",&ch);         //讀入一個字符   
if(ch==' ') T=NULL;
else
{
       T=(BiTNode *)malloc(sizeof(BiTNode)); //生成一個新結點
       T->data=ch;
       CreateBiTree(T->lchild);       //生成左子樹
       CreateBiTree(T->rchild);       //生成右子樹
          }
}

//先序遍歷的遞歸
void PreOrder(BiTree T)
{
if(T)
{
       printf("%c ",T->data);       //訪問結點
       PreOrder(T->lchild);        //遍歷左子樹
       PreOrder(T->rchild);        //遍歷右子樹
}
}

//中序遍歷的遞歸
void InOrder(BiTree T)
{
if(T)
{
       InOrder(T->lchild);        //遍歷左子樹
       printf("%c ",T->data); //訪問結點
       InOrder(T->rchild);        //遍歷右子樹
}
}

//後序遍歷的遞歸
void PostOrder(BiTree T)
{
if(T)
{
       PostOrder(T->lchild); //遍歷左子樹
       PostOrder(T->rchild); //訪問結點
       printf("%c ",T->data); //遍歷右子樹
}
}

//非遞歸中序遍歷   
void InOrderTraverse(BiTree T)
{
stack<BiTree> S;
BiTree p;
S.push(T);//跟指針進棧
while(!S.empty())
{
       p=new BiTNode;
       while((p=S.top())&&p)
        S.push(p->lchild);//向左走到盡頭
       S.pop(); //空指針退棧
       if(!S.empty())
       {
        p=S.top();
        S.pop();
        cout<<p->data<<"       ";
        S.push(p->rchild);
       }
}

}

//先序遍歷的非遞歸
void PreOrder_Nonrecursive(BiTree T)
{
stack<BiTree> S;
BiTree p;

S.push(T);//根指針進棧
while(!S.empty())//棧空時結束
{
       while((p=S.top())&&p)
       {
        cout<<p->data<<"       ";
        S.push(p->lchild);
       }//向左走到盡頭
       S.pop();//彈出堆棧
       if(!S.empty())
       {
        p=S.top();
        S.pop();
        S.push(p->rchild);//向右走一步
       }
}
}


void LeverTraverse(BiTree T)
{//非遞歸層次遍歷
queue <BiTree> Q;
BiTree p;
p = T;
if(visit(p)==1)
       Q.push(p);
while(!Q.empty())
{
       p = Q.front();
       Q.pop();
       if(visit(p->lchild) == 1)
        Q.push(p->lchild);
       if(visit(p->rchild) == 1)
        Q.push(p->rchild);
}
}

int visit(BiTree T)
{
if(T)
{
       printf("%c ",T->data);
       return 1;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章