二叉树2:层次遍历方式及先序、中序、后序(递归与非递归)遍历方式

来源:互联网 发布:淘宝如何购买流量 编辑:程序博客网 时间:2024/05/19 14:17
#include<stdio.h>#include<malloc.h>#include<math.h>#define MaxSize 100typedef char ElemType;typedef struct node{ ElemType data; struct node *lchild; struct node *rchild;}BTNode;// Create BinaryTree by Binary-linked-list BTNode *CreatBTNode(char *str){ BTNode *St[MaxSize],*p=NULL,*b; int top=-1,k,j=0; char ch; b=NULL; ch=str[j]; while (ch!='\0') {  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;   else   {    switch(k)    {    case 1:     St[top]->lchild=p;     break;    case 2:     St[top]->rchild=p;     break;    }   }  }  j++;  ch=str[j]; } return b;}// output Binary Tree by Tree modelvoid DispBTNode(BTNode *b){ BTNode *St[MaxSize],*p; int K[MaxSize]; int i,c,top=-1; int a=-1; int n=3; p=b; do  {  while(p!=NULL)  {   St[++top]=p;   if(p!=b)    ++n;   K[++a]=n;   p=p->rchild;  }  p=St[top--];  c=K[a--];  n=c;  for(i=0;i<=c;i++)   printf("      ");  printf("----%c\n",p->data);  p=p->lchild; } while (top>-1 || p!=NULL);}// traversal based on levelvoid TravLevel(BTNode *b){ BTNode *Qu[MaxSize]; // Circular-queue int front,rear; front=rear=0; if(b!=NULL)  printf("%c",b->data); rear++; Qu[rear]=b; while(rear!=front) {  front=(front+1)%MaxSize;  b=Qu[front];  if(b->lchild!=NULL)  {   printf("%c",b->lchild->data);   rear=(rear+1)%MaxSize;   Qu[rear]=b->lchild;  }  if(b->rchild!=NULL)  {   printf("%c",b->rchild->data);   rear=(rear+1)%MaxSize;   Qu[rear]=b->rchild;  } } printf("\n");} // traversal based on PreOrder  //   :recursive void PreOrder(BTNode *b){ if(b!=NULL) {  printf("%c",b->data);  PreOrder(b->lchild);  PreOrder(b->rchild); }}  // not recursive void PreOrder2(BTNode *b) {  BTNode *St[MaxSize],*p;  int top=-1;  if(b!=NULL)  {   top++;   St[top]=b;   while(top>-1)   {    p=St[top];    top--;    printf("%c",p->data);    if(p->rchild!=NULL)    {     ++top;     St[top]=p->rchild;    }     if(p->lchild!=NULL)     {      ++top;      St[top]=p->lchild;     }   }  }  printf("\n"); }  // In-Order traversal //  :recursive void InOrder(BTNode *b) {  if(b!=NULL)  {   InOrder(b->rchild);   printf("%c",b->data);   InOrder(b->lchild);  } } // not recursive  void InOrder2(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;    }    if(top>-1)    {     p=St[top];     top--;     printf("%c",p->data);     p=p->rchild;    }   }  }  printf("\n"); } // traversal based on PostOrder // :recursive void PostOrder(BTNode *b) {  if(b!=NULL)  {   PostOrder(b->lchild);   PostOrder(b->rchild);   printf("%c",b->data);  } } // not recursive :used tags void PostOrder1(BTNode *b) {  BTNode *St[MaxSize];  BTNode *p;  int flag,top=-1;  if(b!=NULL)  {   do    {    while(b!=NULL)    {     top++;     St[top]=b;     b=b->lchild;    }    p=NULL;    flag=1;    while(top!=-1 && flag)    {     b=St[top];     if(b->rchild==p)     {      printf("%c",b->data);      top--;      p=b;     }     else // return above to traversal left subtree of b     {      b=b->rchild;      flag=0;     }    }   }while(top!=-1);   printf("\n");  } } // using the struct-stack to accomplish Post-Traversal void PostOrder2(BTNode *b) {  BTNode *p;  struct   {   BTNode *q;   int tag;  }St[MaxSize];  int top=0;  p=b;  do   {   while(p!=NULL)   {    top++;    St[top].q=p;    St[top].tag=0;    p=p->lchild;   }   if(top>0)   {    p=St[top].q;    if(St[top].tag==1)    {     printf("%c",p->data);     top--;     p=NULL;    }    else    {     St[top].tag=1;     p=p->rchild;    }   }  } while (p!=NULL||top!=0); } void main() {  BTNode *b;  b=CreatBTNode("A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");  printf("Binary Tree:b");  DispBTNode(b);  printf("\n\n");  printf("traversal based on level:");  TravLevel(b);  printf("\n");  printf("traversal based on PreOrder:\n");  printf("recursive algorithm:");  PreOrder(b);  printf("\n");  printf("not recursive algorithm:");  PreOrder2(b);  printf("\n");  printf("traversal based on InOrder:\n");  printf("recursive algorithm:");  InOrder(b);  printf("\n");  printf("not recursive:");  InOrder2(b);  printf("\n");  printf("traversal based on PostOrder:");  printf("recursive algorithm:");  PostOrder(b);  printf("\n");  printf("not recursive algorithm 1:");  PostOrder1(b);  printf("not recursive algorithm 2:");  PostOrder2(b);  printf("\n"); }


 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 第一试用网的钱提现出现问题怎么办 一个手机号注册两个京东账号怎么办 白色衣服被洗衣粉泡白了怎么办 白色衣服染成一块块荧光色了怎么办 中脉远红镇痛护腰不会发热了怎么办 用完悦诗风吟脸变黑不均匀怎么办 护肤品开封后一年还没用完怎么办 兰蔻化妆品套装正品和假怎么办 月经期间卫生巾搞得屁股疼怎么办 大姨妈特别多用卫生巾老是漏怎么办 夏天用卫生巾不透气摩擦红了怎么办 在日本的洗手间用完的姨妈巾怎么办 想穿短裙但是膝盖怕凉怎么办 裤子被卫生巾粘住扯不下来怎么办 医生说来姨妈不可以用卫生巾怎么办 隆胸以后摸起来感觉假体会动怎么办 产后15个月说恶露没排干净怎么办 母猪产后两天肚子里还有小猪怎么办 背心式无痕运动文胸显得胸小怎么办 卫生巾过敏起疙瘩反复挠不好怎么办 去健身房办卡老板跑了怎么办 买货我已经拒收商家不退款怎么办 在京东买了东西拒收不退款怎么办 罗马仕充电宝进入休眠状态怎么办 广发信用卡寄到家没拿到快递怎么办 包邮商家要买家出物流费怎么办? 美团外卖下单转化率低怎么办 京东退款不小心点了取消退款怎么办 近邻宝开了箱又关了怎么办 近邻宝箱子打开了东西忘记拿怎么办 京东取消订单商家总不取消怎么办 京东快递退货取件一直取不到怎么办 在京东线上付款了但没收到货怎么办 寄快递收件人电话号码写错了怎么办 京东购物实名认证被别人占用怎么办 货已发出单号还没填买家退货怎么办 自提柜还有一个包忘记拿怎么办 当顾客说衣服太贵的时候怎么办 京东快递送错了被别人签收了怎么办 乐视1s玩王者荣耀卡怎么办 京东商城买东西发现地址错了怎么办