二叉树----遍历

二叉树建立和简单遍历(递归和非递归遍历)

#include<iostream>
using namespace std;
#define LEN sizeof(BiTree)
#include<malloc.h>
  struct BiTree{
      BiTree *lchild,*rchild;
    char data;
};
BiTree* CreatBiTree()  //类似先序遍历创立,空位置补*
{
    BiTree *T;
    char ch;cin>>ch;
    if(ch=='*')T=NULL;
    else{
        T=(BiTree *)malloc(LEN);
        T->data=ch;
        T->lchild=CreatBiTree();
        T->rchild=CreatBiTree();
    }
    return T;
}

void RecurBiTree(BiTree *T)  //递归中序遍历
{if(T)
    {RecurBiTree(T->lchild);
    cout<<T->data<<" ";
    RecurBiTree(T->rchild);}
}

void NonRecurBiTree_2(BiTree *T)
{
    int i;
    BiTree *p,*ar[100];
    p=T,i=0;
    if(T==NULL)return;
    do{
        while(p!=NULL)
        {
            ar[i]=p;i++;p=p->lchild;
        }
        if(i>0)
        {
            i--;p=ar[i];cout<<p->data<<" ";p=p->rchild;    //s[i]没有赋值,i--是先回到根树;
        }
     }while(i>0||p!=NULL);         //这里要加或着 p空仅仅出栈 i=0紧紧进栈 两者有一个成立也要运行
     cout<<endl;


}
void NonRecurBiTree_3(BiTree *T)   //非递归后序复杂一些,多了个判断
{
    bool am[100]={0};
    int i;
    BiTree *p,*ar[100];
    p=T,i=0;
    if(T==NULL) return;
    do{
        while(p!=NULL)
        {
            ar[i]=p;i++;p=p->lchild; am[i-1]=0;     //注意次序i始终是多1的 am[i-1]=0必须带 i是栈层数,当出栈后内容有变,应重新初始化


        }
        while(i>0&&am[i-1]==1){p=ar[i-1],cout<<p->data<<" ";i--;}  //只有出栈i才自减
        if(i>0){am[i-1]=1;p=ar[i-1]->rchild;}       //不出栈就不自减,判断赋值用i-1;
    }while(i>0);
}
int main()
{BiTree *Fb=CreatBiTree();
cout<<"递归掉用中序遍历二叉树"<<endl;
RecurBiTree(Fb);
cout<<endl;                //递归不好在函数里加endl;
cout<<"利用栈非递归调用中序遍历二叉树"<<endl;
NonRecurBiTree_2(Fb);
cout<<"利用栈非递归调用后序遍历二叉树"<<endl;
NonRecurBiTree_3(Fb);
    return 0;
}



递归的先序和后序和中序差不多 只要改一下输出流的位置就好了

非递归的先序和中序差不多,也是改一下输出位置,放在第一个whlie就好了:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值