二叉树的创建和先序,中序,后序,递归,非递归遍历

来源:互联网 发布:js涂膜防水套什么定额 编辑:程序博客网 时间:2024/04/29 21:11



#include "stdafx.h"


#include<iostream>

using namespace std;


#define ERROR 0

#define OK 1

#define SMAXSIZE 100


//二叉树的创建

typedef struct BiTNode

{

 char data;

 struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;


//存储二叉树的栈


BiTree CreateBiTree()

 char e;

 BiTree T;

 cin>>e;

 if(e=='#') T=NULL;

 else

 { 

  T=(BiTNode *)malloc(sizeof(BiTNode));

  T->data=e;

  T->lchild=CreateBiTree();

  T->rchild=CreateBiTree();

 }

 return T;

}


//前序递归遍历

void PreOrder(BiTree T)

{

 if(T!=NULL)

 {

  cout<<T->data <<" ";

  PreOrder(T->lchild );

  PreOrder(T->rchild );

 }

}

//中序递归遍历

void InOrder(BiTree T)

{

 if(T!=NULL)

 {

  InOrder(T->lchild );

  cout<<T->data <<" ";

  InOrder(T->rchild );

 }

}

//后序递归遍历 

void PostOrder(BiTree T)

{

 if(T!=NULL)

 {

  PostOrder(T->lchild );

  PostOrder(T->rchild );

  cout<<T->data <<" ";

 }

}


//前序非递归遍历

void Pre_Order(BiTree T)

{

 BiTree stack[SMAXSIZE],p;

 int top;

 if(T!=NULL)

 {

  top=1;

  stack[top]=T;

  while(top>0)

  {

   p=stack[top--];

   cout<<p->data<<" ";

   if(p->rchild!=NULL)

    stack[++top]=p->rchild;

   if(p->lchild!=NULL)

    stack[++top]=p->lchild;

  }

 }

}

//中序非递归遍历

void In_Order(BiTree T)

{

 BiTree stack[SMAXSIZE],p;

 p=T;

 int top =0;

 while(p!=NULL||top>0)

 {

  if(p!=NULL)

  {

   stack[++top]=p;

   p=p->lchild ;

  }

  else{

   p=stack[top--];

   cout<<p->data<<" " ;

   p=p->rchild ;


  }

 }

}


//后序非递归遍历

void Post_Order(BiTree T)

{

 typedef struct

 {

  BiTree ptr;

  int tag;

 }Snode;

 Snode stack[SMAXSIZE] ,s;

 int top=0;

 BiTree p=T;

 while(p!=NULL||top>0)

 {

  if(p!=NULL)

  {

   s.ptr=p;

   s.tag=1;

   stack[++top]=s;

   p=p->lchild ;//继续遍历左子树

  }

  else {

   s=stack[top--];//当p=NULL且top>0是,则做出栈操作

   p=s.ptr;

   if(s.tag==1)

   {

    //第二次入栈tag标记为2

    s.tag=2;

    stack[++top]=s;

    p=p->rchild ; //继续遍历右子树


   }

   else {

  cout<<p->data ;

  p=NULL;

   }

  }

 }


}


void main()

{

 BiTree T;

 printf("创建二叉树:\n");

 printf("**********************************************************\n");

 printf("请按顺序输入二叉树的元素: \n");

 T=CreateBiTree();


 //下面是二叉树的递归遍历

 cout<<"下面是遍历二叉树"<<endl;

 cout<<"**********************************************************"<<endl;

 cout<<"\n下面是先序递归遍历:"<<endl;

 PreOrder(T);

 cout<<"\n下面是中序递归遍历:"<<endl;

 InOrder(T);

 cout<<"\n下面是后序递归遍历:"<<endl;

 PostOrder(T);

 cout<<"递归遍历完毕"<<endl;

 cout<<"\n下面是非递归遍历:"<<endl;

 cout<<"**********************************************************"<<endl;

 cout<<"下面是先序非递归遍历"<<endl;

 Pre_Order(T);

 cout<<"\n下面是中序非递归遍历"<<endl;

 In_Order(T);


 cout<<"\n\n全部遍历结束!"<<endl;

}

0 0
原创粉丝点击