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

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

#include<iostream>
#include<stdlib.h>
#include<string>
#include<stack>
#include<queue>
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<BTree> s;
    BTree p=T;
    // s.push(p); 刚开始需不需要压栈
    while(p||!s.empty()){ //进入循环的条件
        if(p) {
            cout<<p->data;
            s.push(p);
            p=p->ltree;
        }
        else{
            p=s.top();
            s.pop();
            p=p->rtree;
        }
    }
}
void inOrderTraverseStack(BTree T){
    stack<BTree> s;
    BTree p=T;
    while(p||!s.empty()){ //进入循环的条件
        if(p) {
            
            s.push(p);
            p=p->ltree;
        }
        else{
            p=s.top();
            s.pop();
            cout<<p->data;
            p=p->rtree;
        }
    }
}
//后序遍历的重点是,结点可以访问的条件是 1、左子树访问完毕,2、右子树访问完毕(结点为NULL或者已经访问过了)
 
void postOrderTraverseStack(BTree T){
    stack<BTree> 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<<p->data;   // 访问完才出栈
            n=p;
            p=NULL;    
            s.pop();
        }else{
            p=p->rtree;
        }
    }
}
void preOrderTraverse(BTree T){
    if(T){
        cout<<T->data;
        preOrderTraverse(T->ltree);
        preOrderTraverse(T->rtree);
    }
}
void inOrderTraverse(BTree T){
    if(T){
        inOrderTraverse(T->ltree);
        cout<<T->data;
        inOrderTraverse(T->rtree);
    }
}
void postOrderTraverse(BTree T){
    if(T){
        postOrderTraverse(T->ltree);
        postOrderTraverse(T->rtree);
        cout<<T->data;
    }
}
void levelTraverse(BTree T){
    queue<BTree> q;
    q.push(T);
    while(!q.empty()){
        BTree p=q.front();
        q.pop();
        cout<<p->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<<endl;
    inOrderTraverse(L);cout<<endl;
    postOrderTraverse(L);cout<<endl;
    preOrderTraverseStack(L);cout<<endl;
    inOrderTraverseStack(L);cout<<endl;
    postOrderTraverseStack(L);cout<<endl;
    levelTraverse(L);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值