C++实现二叉树的各种遍历(前中后层次)递归和非递归

用的是C++ STL的栈和队。。其中后序遍历的非递归比较难写。注释也是最多。

#include
#include
#include
#include
#include
using namespace std;
typedef char Element;
typedef struct Node{
    Element data;
    Node* ltree;
    Node* rtree;
}BNode;
typedef BNode* BTree;
//有自己的创建规则
bool creatBinaryTree(BTree &T,char a[],int &k){
    Element e=a[k];
    if(e==';'){
        T=NULL;
    }
    else{
        T=(BTree)malloc(sizeof(Node));
        T->data=e;
        k++;
        creatBinaryTree(T->ltree,a,k);
        k++;
        creatBinaryTree(T->rtree,a,k);
    }
    return true;
}
void preOrderTraverseStack(BTree T){
    stack s;
    BTree p=T;
    // s.push(p); 刚开始需不需要压栈
    while(p||!s.empty()){ //进入循环的条件
        if(p) {
            cout<data;
            s.push(p);
            p=p->ltree;
        }
        else{
            p=s.top();
            s.pop();
            p=p->rtree;
        }
    }
}
void inOrderTraverseStack(BTree T){
    stack s;
    BTree p=T;
    while(p||!s.empty()){ //进入循环的条件
        if(p) {
            
            s.push(p);
            p=p->ltree;
        }
        else{
            p=s.top();
            s.pop();
            cout<data;
            p=p->rtree;
        }
    }
}
//后序遍历的重点是,结点可以访问的条件是 1、左子树访问完毕,2、右子树访问完毕(结点为NULL或者已经访问过了)
 
void postOrderTraverseStack(BTree T){
    stack s;
    BTree p=T;
    BTree n=NULL;
    while(p||!s.empty()){
        while(p){
            s.push(p);
            p=p->ltree;  //1、左子树访问完毕,
        }                 //   此时先不用出栈 ,
        p=s.top();         //   只需获取栈顶的结点即可 。
        if(p->rtree==NULL||p->rtree==n){  //2、右子树访问完毕(右结点为NULL或者右结点为上次访问的结点)
            cout<data;   // 访问完才出栈
            n=p;
            p=NULL;    
            s.pop();
        }else{
            p=p->rtree;
        }
    }
}
void preOrderTraverse(BTree T){
    if(T){
        cout<data;
        preOrderTraverse(T->ltree);
        preOrderTraverse(T->rtree);
    }
}
void inOrderTraverse(BTree T){
    if(T){
        inOrderTraverse(T->ltree);
        cout<data;
        inOrderTraverse(T->rtree);
    }
}
void postOrderTraverse(BTree T){
    if(T){
        postOrderTraverse(T->ltree);
        postOrderTraverse(T->rtree);
        cout<data;
    }
}
void levelTraverse(BTree T){
    queue q;
    q.push(T);
    while(!q.empty()){
        BTree p=q.front();
        q.pop();
        cout<data;
        if(p->ltree){
            q.push(p->ltree);
        }
        if(p->rtree){
            q.push(p->rtree);
        }
    }
}
int main(){
    BTree L=NULL;
    char a[15]={'a','b','d',';',';','e','g',';',';',';','c',';','f',';',';'};
    int k=0;
    creatBinaryTree(L,a,k);
    preOrderTraverse(L);cout<     inOrderTraverse(L);cout<     postOrderTraverse(L);cout<     preOrderTraverseStack(L);cout<     inOrderTraverseStack(L);cout<     postOrderTraverseStack(L);cout<     levelTraverse(L);
}

你可能感兴趣的:(数据结构)