二叉樹的非遞歸遍歷C++實現


#include<iostream>
#include<stdlib.h>
#define maxsize 100

using namespace std;

typedef struct BTNode{
    char val;
    BTNode *lchild, *rchild;
}*BiTNode;

void CreateTree(BTNode *&root){
    char c;
    cin >> c;
    if(c == '#')
        root = NULL;
    else{
        root = (BTNode *) malloc(sizeof(BTNode));
        if(!root){
            cerr << "No More Memory!" << endl;
            exit(-1);
        }
        root->val = c;
        CreateTree(root->lchild);
        CreateTree(root->rchild);
    }
}

void PreOrderRecursion(BTNode *root){
    if(root){
        cout << root->val << " ";
        PreOrderRecursion(root->lchild);
        PreOrderRecursion(root->rchild);
    }
}

void PreOrderNoRecursion(BTNode *root){
    if(!root){
        cout << "Root is NULL!" << endl;
        return;
    }
    BTNode* stack[maxsize];   //模擬一個棧
    int top = -1;             //棧頂指針
    stack[++top] = root;
    while(top != -1){
        BTNode *p = stack[top--];
        cout << p->val << " ";
        if(p->rchild)         //由於左子樹先被訪問,則右子樹應該先入棧
            stack[++top] = p->rchild;
        if(p->lchild)
            stack[++top] = p->lchild;
    }
}

void InOrderRecursion(BTNode *root){
    if(root){
        InOrderRecursion(root->lchild);
        cout << root->val << " ";
        InOrderRecursion(root->rchild);
    }
}

void InOrderNoRecursion(BTNode *root){
    if(!root){
        cout << "Root is NULL!" << endl;
        return;
    }
    BTNode* stack[maxsize];
    int top = -1;
    BTNode *p = root;
    while(top != -1 || p != NULL){
        while(p){
            stack[++top] = p;
            p = p->lchild;
        }
        //從根節點一直往左子樹遍歷,如果沒有左子樹
        //打印這個節點,往右節點移動
        p = stack[top--];
        cout << p->val << " ";
        p = p->rchild;
    }
}

void PostOrderRecursion(BTNode *root){
    if(root){
        PostOrderRecursion(root->lchild);
        PostOrderRecursion(root->rchild);
        cout << root->val << " ";
    }
}

void PostOrderNoRecursion(BTNode *root){
    if(!root){
        cout << "Root is NULL!" << endl;
        return;
    }
    BTNode* stack1[maxsize];  int top1 = -1;
    BTNode* stack2[maxsize];  int top2 = -1;
    //首先把根節點如stack1
    stack1[++top1] = root;
    while(top1 != -1){
        BTNode *p = stack1[top1--];
        stack2[++top2] = p;
        if(p->lchild)
            stack1[++top1] = p->lchild;
        if(p->rchild)
            stack1[++top1] = p->rchild;
    }
    //此時倒序輸出stack2即為后序遍歷的序列
    while(top2 != -1){
        BTNode *p = stack2[top2--];
        cout << p->val << " ";
    }
}

int main(){
    BTNode *root;
    CreateTree(root);
     /**
        test code
      */
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM