二叉樹的遍歷

設計和調試的算法微笑希望對你們有用喲:

1、遞歸建立二叉樹;

2、先序遞歸遍歷二叉樹;

3、中序遞歸遍歷二叉樹;

4、後序遞歸遍歷二叉樹。

5、中序非遞歸遍歷二叉樹

首先要建立一個工程,編譯器用codeblocks, vc 6.0等,都能運行,但是可能需要自己調試一下,畢竟每個編譯器的環境都是不一樣的。微笑

頭文件//header,h

#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <windows.h>
#define  TRUE 1
#define  FALSE 0
#define  OK 1
#define  ERROR 0
#define INFEASIBLE -1
#define  OVERFLOW-2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
using namespace std;
              //Status是函數的類型,其值是函數結果狀態代碼
typedef int  status;
typedef int TelemType;
 


算法頭文件//Bitree.h

 

#include"header.h"
typedef struct BiTNode {
       TelemTypedata;
        structBiTNode *lchild,*rchild;
} BiTNode,*BiTree;
typedef BiTree SElemType;
typedef struct {
              SElemType *base;
              SElemType  *top;
              int stacksize;
              }SqStack;
status InitStack(SqStack &S) {
       S.base =(SElemType *)malloc  (STACK_INIT_SIZE*sizeof (SElemType));
       if(!S.base) exit (OVERFLOW);
       S.top =S.base;
       S.stacksize= STACK_INIT_SIZE;
       return OK;
     }//InitStack
status StackEmpty(SqStack S)
{
  if (S.base==S.top)
    return TRUE;
  return FALSE;
}
status Push(SqStack &S, SElemType &e) {
          if (S.top-S.base>=S.stacksize) //棧滿
           { S.base=(SElemType *)realloc
             (S.base, (S.stacksize+STACKINCREMENT)
             * sizeof(SElemType));
             if (!S.base) exit (OVERFLOW);
             S.top  = S.base + S.stacksize;
             S.stacksize+=STACKINCREMENT;
              } // if
           *S.top++ = e;   return OK; } //Push
status Pop(SqStack &S, SElemType &e) {
         if(S.top == S.base)return ERROR;
        e = * -- S.top;
        return OK;
       } //Pop
status CreateBiTree(BiTree &T){
//按先序次序輸入二叉樹中結點的值,空格表示空樹
//生成二叉樹的二叉鏈表存儲結構,T爲根結點指針]
    char ch;
   cin>>ch;
    if (ch==' ')T=NULL;
    else{
          if(!(T=(BiTNode *) malloc(sizeof(BiTNode)))) exit(OVERFLOW);
          T->data=ch;  //建立根結點
          CreateBiTree( T->lchild);  //建立左子樹
          CreateBiTree(T->rchild);  //建立右子樹
          }
  return OK;
} //CreateBiTree
status PrintElement(TelemType e)
{
   cout<<e;  //輸出元素值
    return OK;
}
status PreorderTraverse(BiTree T, status(*visit)(TelemType e)) {
//先序遍歷根結點指針爲T的二叉樹
 
if (T)  {
   if(visit(T->data))
     if(PreorderTraverse(T->lchild,visit))
       if(PreorderTraverse(T->rchild,visit)) return OK;
       returnERROR;
       }elsereturn OK;   //if (T)
 }//PreorderTraverse
status InorderTraverse1(BiTree T, status(*visit)(TelemType e)) {
       //先序遍歷根結點指針爲T的二叉樹
 
       if(T)  {
              if(InorderTraverse1(T->lchild,visit))
                     if(visit(T->data))
                            if(InorderTraverse1(T->rchild,visit)) return OK;
              returnERROR;
       }elsereturn OK;   //if (T)
}//InorderTraverse
status  PostorderTraverse(BiTreeT, status(*visit)(TelemType e)) {
//後序遍歷根結點指針爲T的二叉樹
 
if (T)  {
   if(PostorderTraverse(T->lchild,visit))
       if(PostorderTraverse(T->rchild,visit))
              if(visit(T->data))  return OK;
       returnERROR;
       }elsereturn OK;   //if (T)
 }//PostorderTraverse
status InorderTraverse2(BiTree T,status(*visit)(TelemType e)) {
       SqStack S;
       InitStack(S);   BiTree p = T;
              while(p || !StackEmpty(S) ){ // 找到最左下的結點
                     if(p)
               {  Push(S,p);   p=p->lchild;  } // 根指針進棧,遍歷左子樹
                     else  {                                 //根指針退棧,訪問根結點,遍歷右子樹
                            Pop(S,p);   if (!visit(p->data)  ) return ERROR;
                            p=p->rchild;
                     }//else
              }// while
              return  OK;
}// InOrderTraverse

主函數//main.cpp

#include"header.h"
#include"Bi tree.h"
int main()
{
    BiTree T;
    cout<< "Please input characters to create a tree" << endl;
   CreateBiTree(T);
    cout<<endl<< "preorder traverse the tree:"<<endl;
   PreorderTraverse(T, PrintElement);
    cout<<endl<<"inorder traverse thw tree:digui"<<endl;
    InorderTraverse1(T,PrintElement);
    cout<<endl<<"Inorder traverse the tree:feidigui"<<endl;
   InorderTraverse2(T,PrintElement);
    cout<<endl<<"Postorder traverse the tree:"<<endl;
   PostorderTraverse(T,PrintElement);
    return 0;
}
 


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