1. 程式人生 > >二叉樹的建立與遍歷

二叉樹的建立與遍歷

#include<iostream>
#include<cstring>
#include<conio.h>
#include<cstdlib>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
using namespace std;

typedef char TElemType;
typedef struct BiTNode{
    TElemType data; 
    struct BiTNode *lchild,*rchild; 
}BiTNode, *BiTree; 

int CreateBiTree(BiTree &T){ 
    char ch; 
    cout<<"Please input data(/ for NULL Node!): "; 
    cin>>ch;//輸入一個字元   
    if (ch =='/') //如果是/字元代表節點為空   
        T = NULL;  
    else {  
        if(!(T=(BiTNode*)malloc(sizeof(BiTNode)))){//如果記憶體分配失敗   
            cout<< OVERFLOW <<endl;  
            return ERROR;//返回ERROR   
        }  
        T->data = ch;//該節點資訊設定為ch   
        CreateBiTree (T->lchild);//遞迴建立左子樹   
        CreateBiTree (T->rchild);//遞迴建立右子樹   
    return OK;//返回OK   
}  
}

void PreOrderTraverse (BiTree T){//T為要前序遍歷的樹或子樹的根節點   
    if(T==NULL) //若T為空  
        return; 
    /*對根節點操作*/    
    cout<<T->data<<"->"; 
    PreOrderTraverse(T->lchild);//遞迴遍歷左子樹  
    PreOrderTraverse (T->rchild);//遞迴遍歷右子樹  
} 

void InOrderTraverse (BiTree T){//T為要中序遍歷的樹或子樹的根節點   
    if(T==NULL) //若T為空  
        return;  
    InOrderTraverse(T->lchild);//遞迴遍歷左子樹  
    /*對根節點操作*/  
    cout<<T->data<<"->";  
    InOrderTraverse (T->rchild);//遞迴遍歷右子樹  
}  

void PostOrderTraverse (BiTree T){//T為要後序遍歷的樹或子樹的根節點   
    if(T==NULL) //若T為空  
        return;  
    PostOrderTraverse(T->lchild);//遞迴遍歷左子樹 
    PostOrderTraverse(T->rchild);//遞迴遍歷右子樹  
    /*對根節點操作*/  
    cout<<T->data<<"->";   
} 

int main(){  
    BiTree T;  
    cout<<endl<<endl<<"InOrderTraverse.cpp By:WJX"<<endl;  
    cout<<endl<<endl<<"=========================="<<endl;  
    cout<<endl<<endl<<"Please input data to create BiTree:"<<endl;  
    CreateBiTree(T);  
    //輸出前序遍歷的結果 
    cout<<endl<<"PreOrder :"<<endl<<endl<<"Begin->";  
    PreOrderTraverse(T);  
    cout<<"END !"<<endl<<endl<<"...OK!..."<<endl;
	//輸出中序遍歷的結果      
    cout<<endl<<"InOrder :"<<endl<<endl<<"Begin->";  
    InOrderTraverse(T);  
    cout<<"END !"<<endl<<endl<<"...OK!..."<<endl;  
    //輸出後序遍歷的結果 
    cout<<endl<<"PostOrder :"<<endl<<endl<<"Begin->";  
    PostOrderTraverse(T);  
    cout<<"END !"<<endl<<endl<<"...OK!..."<<endl;     
    getch();  
}