二叉树创建和遍历

来源:互联网 发布:虚拟声卡软件 编辑:程序博客网 时间:2024/06/05 20:57

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

#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就好了:)

1 0