二叉树非递归遍历

 

#include<iostream>
using namespace std;
#define MaxSize 100//最多100个字符
typedef struct node
{
 char data;
 struct node *lchild;
 struct node *rchild;
}BTNode;
void CreateBTNode(BTNode *&b,char *str)
{
 BTNode *St[MaxSize],*p=NULL;
 int top=-1,k,j=0;
 char ch;
 b=NULL;   //建立二叉树时
 ch=str[j];
 while(ch!='\0')//str未扫描完循环
 {
  switch(ch)
  {
  case'(':top++;St[top]=p;k=1;break;//为左结点
  case')':top--;break;
  case',':k=2;break;     //为右结点
  default:p=(BTNode *)malloc(sizeof(BTNode));
   p->data=ch;
   p->lchild=p->rchild=NULL;
   if(b==NULL)
    b=p;      //p指向二叉树根节点
   else       //已建立二叉树
   {
    switch(k)
    {
    case 1:St[top]->lchild=p;break;
    case 2:St[top]->rchild=p;break;
    }
   }
  }
  j++;
  ch=str[j];
 }
}
void PreOrder(BTNode *b)    //先序遍历
{
 BTNode *St[MaxSize],*p;
 int top=-1;
 if(b!=NULL)
 {
  top++;
  St[top]=b;
  while(top>-1)    //栈不空循环
  {
   p=St[top];    //出栈并访问改结点
   top--;
   cout<<p->data;
   if(p->rchild!=NULL)  //右孩子入栈
   {
    top++;
    St[top]=p->rchild;
   }
   if(p->lchild!=NULL)  //左孩子入栈
   {
    top++;
    St[top]=p->lchild;
   }
  }
  cout<<endl;
 }
}
void InOrder(BTNode *b)
{
 BTNode *St[MaxSize],*p;
 int top=-1;
 if(b!=NULL)
 {
  p=b;
  while(top>-1||p!=NULL)   
  {
   while(p!=NULL)    //栈不空循环
   {
    top++;    
    St[top]=p;
    p=p->lchild;   //P指向最左边的叶子
   }
   if(top>-1)     //将最左边叶子出栈
   {
    p=St[top];
    top--;     //指向已出栈叶子结点的父亲
    cout<<p->data;   //出栈最左边结点
    p=p->rchild;
   }
  }
  cout<<endl;
 }
}
void PostOrder(BTNode *b)  //后序遍历

 BTNode *St[MaxSize],*p;
 int f,top=-1;    //栈指针置初值
 if(b!=NULL)
 {
  do
  {
   while(b!=NULL)  //将b的所有左节点入栈
   {
    top++;
    St[top]=b;
    b=b->lchild;
   }
   p=NULL;    //p指向当前节点的前一个已访问的结点
   f=1;    //设置b的访问标记为已访问过
   while(top!=-1&&f) 
   {
    b=St[top];  //取出当前栈顶元素
    if(b->rchild==p)//右子树不存在或已访问,访问之
    {
     cout<<b->data;//访问*b节点
     top--;
     p=b;   //p指向刚被访问的结点
    }
    else
    {
     b=b->rchild; //t指向右子树
     f=0;   //设置未被访问过的标记
    }
   }
  }
  while(top!=-1);
  cout<<endl;
 }
}


void main()
{
 BTNode *b;
 char s[100];
 cout<<"请输入一个二叉数:";
 gets(s);
 CreateBTNode(b,s);
 cout<<"前序遍历;";
 PreOrder(b);
 cout<<"中序遍历;";
 InOrder(b);
 cout<<"后序遍历;";
 PostOrder(b);
}
//测试数据:A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值