二叉樹的創建和遍歷

概念和性質

樹的相關概念和性質

二叉樹的相關概念和性質

遞歸實現二叉樹的創建和遍歷

代碼

#include<stdio.h>
#include<stdlib.h>

typedef struct TreeNode{
    int data;
    struct TreeNode *Lchild;
    struct TreeNode *Rchild;
} TreeNode,*P_TreeNode; 

//創建樹(前序遍歷創建樹,輸入:AB#D##C##) 
void createTree(P_TreeNode &T) {
    char data;
    scanf("%c",&data); 
    if(data == '#'){
        T = NULL;
        return ;
    }else{
        T = (P_TreeNode)malloc(sizeof(TreeNode)); 
        if(T == NULL){
            printf("創建失敗!\n");
            exit(-1); 
        }
        T->data = data;
        createTree(T->Lchild);//遞歸創建左子樹 
        createTree(T->Rchild);//遞歸創建右子樹 
    }
}
//先序遍歷
void  preOrderTraversal(P_TreeNode T){
    if(T == NULL){
        return ;
    }
    printf("%3c",T->data);
    preOrderTraversal(T->Lchild);
    preOrderTraversal(T->Rchild); 
}
//中序遍歷
void  mediumOrderTraversal(P_TreeNode T){
    if(T == NULL){
        return;
    }
    mediumOrderTraversal(T->Lchild);
    printf("%3c",T->data);
    mediumOrderTraversal(T->Rchild);
} 
//後序遍歷
void afterOrderTraversal(P_TreeNode T){
    if(T == NULL){
        return; 
    } 
    afterOrderTraversal(T->Lchild);
    afterOrderTraversal(T->Rchild);
    printf("%3c",T->data);
} 

int main(){
    P_TreeNode T;
    createTree(T);
    printf("\n先序遍歷:");
    preOrderTraversal(T);
    printf("\n中序遍歷:");
    mediumOrderTraversal(T);
    printf("\n後序遍歷:"); 
    afterOrderTraversal(T); 
    printf("\n");
    return 0;
}

執行結果

這裏寫圖片描述

非遞歸實現二叉樹的創建和遍歷

代碼

#include<stdio.h>
#include<stdlib.h> 
#include <stack>  //需要引入棧文件 

using namespace std;//同時要設置命名空間 

//定義樹結構
typedef struct Node{ 
    char data;
    struct Node *lchild;
    struct Node *rchild;
}Node,*Tree;

//創建樹:ABD##E##CF####
void createTree(Tree &T){ 
    char data;
    scanf("%c",&data);               
    if(data == '#'){
        T = NULL; 
    }else{
        T = (Node*)malloc(sizeof(Node));
        if(T == NULL){
            printf("創建樹失敗!\n");
            return;
        }
        T->data = data;
        createTree(T->lchild);
        createTree(T->rchild);
    }   
}

//非遞歸先序遍歷
void  preOrderTraversal(Tree T){
    stack<Tree> Stack;
    while(T || !Stack.empty()){//直到當前節點爲NULL且棧空時,循環結束  
        while(T){
             printf("%3c",T->data);//從根節點開始,輸出當前節點,
             Stack.push(T); //並將其入棧
             T = T->lchild;//同時置其左孩子爲當前節點,直至其沒有左孩子,即當前節點爲NULL   
        } 

        T = Stack.top();//獲取棧頂 
        Stack.pop();//將棧頂節點出棧 
        T = T->rchild;//同時置其右孩子爲當前節點,循環判斷,直至T不爲空
    }
}
//非遞歸中序遍歷
void  mediumOrderTraversal(Tree T){
    stack<Tree> Stack;
    while(T || !Stack.empty()){//直到當前節點爲NULL且棧空時,循環結束  
        while(T){
            Stack.push(T);//入棧 
            T = T->lchild;//同時置其左孩子爲當前節點,直至其沒有左孩子,即當前節點爲NULL  
        }
        T = Stack.top();//獲取當前棧頂 
        Stack.pop();//將棧頂出棧 
        printf("%3c",T->data);//輸出當前節點 
        T = T->rchild;//同時置其右孩子爲當前節點,循環判斷,直至T不爲空
    }
}
//非遞歸後序遍歷
void afterOrderTraversal(Tree T){
    stack<Tree> Stack;
    Tree pCur; //定義指針,指向當前節點  
    Tree pPre = NULL;//定義指針,指向上一各訪問的節點  

    Stack.push(T);
    while(!Stack.empty()){
        pCur = Stack.top();
        //如果當前節點沒有左右孩子,或者有左孩子或有孩子,但已經被訪問輸出,  
        //則直接輸出該節點,將其出棧,將其設爲上一個訪問的節點  
        if((pCur->lchild==NULL && pCur->rchild == NULL) ||
        (pPre != NULL && (pCur->lchild==pPre || pCur->rchild == pPre))){
            printf("%3c",pCur->data);
            Stack.pop();
            pPre = pCur;
        }else{
            //如果不滿足上面兩種情況,則將其右孩子左孩子依次入棧  
            if(pCur->rchild != NULL)  
                Stack.push(pCur->rchild);  
            if(pCur->lchild != NULL)  
               Stack.push(pCur->lchild);
        }
    }

} 

int main(){
    Tree T;

    printf("創建樹:(ABD##E##CF####回車)\n");
    createTree(T); 
    printf("非遞歸先序遍歷:");
    preOrderTraversal(T);
    printf("\n非遞歸中序遍歷:");
    mediumOrderTraversal(T);
    printf("\n非遞歸後序遍歷:");
    afterOrderTraversal(T); 
    printf("\n");
    printf("\n");
    return 0;               
}

執行結果

這裏寫圖片描述

參考網址:
http://blog.csdn.net/pi9nc/article/details/13008511
http://blog.csdn.net/cxllyg/article/details/7520037

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