数据结构之二叉树

用递归和非递归的方法实现一棵树的三种遍历:

#include<iostream>
#include<stdio.h>
#include<cstdio>
#define MAXSIZE 100
typedef char TElemType;
using namespace std;
typedef struct BiTNode{  //定二叉树的结构体 
    TElemType data;
    struct BiTNode *lchild,*rchild; 
}BiTNode,*BiTree;

//初始化二叉树 
void InitBiTree(BiTree &T){
    T=NULL;
}
//创建一个二叉树 
void CreateBiTree(BiTree &T){
    TElemType ch;
    cin>>ch;
    if(ch=='#') T=NULL;
    else {
        T = new BiTNode;
        T->data=ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}



//递归调用 
void PreOrderTraversal1(BiTree T){ //先序遍历二叉树 
    if(T){
        cout<<T->data; //访问左子树 
        PreOrderTraversal1(T->lchild); //访问结点 
        PreOrderTraversal1(T->rchild); // 访问右子树
    } 
}

void InOrderTraversel1(BiTree T){ //中序遍历二叉树 
    if(T){
        InOrderTraversel1(T->lchild); //访问左子树
        cout<<T->data; //访问结点
        InOrderTraversel1(T->rchild); // 访问右子树
    } 
}

void PostOrderTraversal1(BiTree T){ //后序遍历二叉树 
    if(T){
        PostOrderTraversal1(T->lchild); //访问左子树 
        PostOrderTraversal1(T->rchild); //访问右子书 
        cout<<T->data;// 访问结点 
    } 
}

//非递归调用
void PreOrderTraversal2(BiTree T){
        BiTree stack[MAXSIZE];
        int top;  //栈顶指针 
        BiTNode *p; //定义一个结点的指针
        top=0;
        p=T;
        while(p||top>0){
            while(p!=NULL){
                cout<<p->data;
                stack[top++]=p;
                p=p->lchild;
            }
                if(top>0){
                    p=stack[--top];
                    p=p->rchild;
                }
            }
        } 

void InOrderTraversal2(BiTree T){
        BiTree stack[MAXSIZE];
        int top;  //栈顶指针 
        BiTNode *p; //定义一个结点的指针
        top=0;
        p=T;
        while(p!=NULL||top>0){
            while(p!=NULL){
            stack[top++]=p;
            p=p->lchild;
            }
        if(top>0){
            p=stack[--top];
            cout<<p->data;
            p=p->rchild;
        } 
    }
}


void PostOrderTraversal2(BiTree T){
BiTree stack[MAXSIZE];
        int top;  //栈顶指针 
        BiTNode *p,*q; //定义一个结点的指针
        top=0;
        p=T,q=NULL;
        while(p!=NULL||top>0){
            while(p!=NULL){
            stack[top++]=p;
            p=p->lchild;
        }
        if(top>0){
            p=stack[top-1];
            if(p->rchild==NULL||p->rchild==q){
                cout<<p->data;
                q=p;
                p=NULL;
                top--;
            }
            else p=p->rchild; 
        } 
    }
}


int main(){
    int m;
    char ch[MAXSIZE]; 
    BiTree T;
    InitBiTree(T); 
    cout<<"请输入二叉树...."<<endl;
    CreateBiTree(T); 
    cout<<"请选择遍历方式: 输入0为递归遍历   输入1为非递归遍历"<<endl; 
    scanf("%d",&m);
    if(m==0){
        cout<<"********现在是递归调用!********"<<endl;
        cout<<"先序遍历:";PreOrderTraversal1(T);cout<<"\n";
        cout<<"中序遍历:";InOrderTraversel1(T);cout<<"\n";
        cout<<"后序遍历:";PostOrderTraversal1(T);cout<<"\n";
    }
    else if(m==1){
        cout<<"********现在是非递归调用!********"<<endl;
        cout<<"先序遍历:";PreOrderTraversal2(T);cout<<"\n";
        cout<<"中序遍历:";InOrderTraversal2(T);cout<<"\n";
        cout<<"后序遍历:";PostOrderTraversal2(T);cout<<"\n";
    }
    else cout<<"选择有误!"<<endl; 
    return 0;
} 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值