首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

二叉树按层遍历,该如何解决

2012-11-03 
二叉树按层遍历二叉树按层遍历,输出时每层结束换行。如何用C++实现?[解决办法]http://www.oschina.net/code

二叉树按层遍历
二叉树按层遍历,输出时每层结束换行。如何用C++实现?

[解决办法]
http://www.oschina.net/code/snippet_257994_10789
[解决办法]

C/C++ code
#include<stdio.h>#include<stdlib.h>typedef  struct  btnode{   char  data;   struct btnode  *lchild, *rchild;   }BTNode;typedef struct{   BTNode elem[20];   int front,rear;   }SqQueue;BTNode * CreatTree( void );void  Preorder(BTNode *bt );void  Inorder(BTNode *bt );void  Postorder(BTNode *bt );void  Levelsorder(BTNode *bt);void  ExChangeLeafs(BTNode *bt);void  EnQueue(SqQueue *sq,BTNode *bt);void  DelQueue(SqQueue *sq,BTNode *p);void  InitQueue(SqQueue *sq);main(){  BTNode *t;  char s[10];  for(;;)  {      printf("1--------CreatTree    2-----------Preorder  \n");      printf("3--------Inorder      4-----------Postorder  \n");      printf("5--------Levelsorder  6-----------ExchangeLeafs(Preorder)  \n");      printf("7--------Exit\n");      gets(s);      switch(*s)      {        case '1':  t=CreatTree();                   break;    case '2':  Preorder(t);                   printf("\n");                   break;        case '3':  Inorder(t);                   printf("\n");                   break;        case '4':  Postorder(t);                   printf("\n");                   break;    case '5':  Levelsorder(t);                   printf("\n");           break;    case '6':  ExChangeLeafs(t);                   Preorder(t);                   printf("\n");                   break;        case '7':  printf("exit \n");                   exit(0);    }  }} #define  MAXNUM  20 BTNode * CreatTree( void ){     int i=1,j;char ch;      BTNode *p[MAXNUM+1],*t,*s;      t=NULL;      printf("\n enter i,ch: \n");      scanf("%d,%c",&i,&ch);      while( i!=0 && ch!='#')     {       s=(BTNode *)malloc(sizeof(BTNode));       s->data=ch;       s->lchild=s->rchild=NULL;       p[i]=s;       if(i==1) t=s;       else      {          j=i/2;          if(i%2==0) p[j]->lchild=s;          else p[j]->rchild=s;       }       scanf("%d,%c",&i,&ch);      }      ch=getchar();      return t; }void  Preorder(BTNode *bt ){     if (bt)     {       printf("%5c",bt->data);       Preorder(bt->lchild);       Preorder(bt->rchild);      } }void  Inorder(BTNode *bt ){    if (bt)   {    Inorder(bt->lchild);    printf("%5c",bt->data);    Inorder(bt->rchild);    }}void  Postorder(BTNode *bt ){     if (bt)     {        Postorder(bt->lchild);        Postorder(bt->rchild);    printf("%5c",bt->data);      } }void ExChangeLeafs(BTNode *bt){    BTNode *temp;    if(bt)    {      temp=bt->lchild;      bt->lchild=bt->rchild;      bt->rchild=temp;      ExChangeLeafs(bt->lchild);      ExChangeLeafs(bt->rchild);     }}void  Levelsorder(BTNode *bt){  BTNode p;   SqQueue sq;   InitQueue(&sq);   EnQueue(&sq,bt);   while(sq.front!=sq.rear)  { DelQueue(&sq,&p);    printf("%5c",p.data);    if(p.lchild) EnQueue(&sq,p.lchild);    if(p.rchild) EnQueue(&sq,p.rchild);   }}void InitQueue(SqQueue *sq){  sq->front=sq->rear=0;}void  EnQueue(SqQueue *sq ,BTNode *bt){ sq->elem[sq->rear]=*bt;  sq->rear=(sq->rear+1)%20;}void  DelQueue(SqQueue *sq,BTNode *p){   *p=sq->elem[sq->front];   sq->front=(sq->front+1)%20;}
[解决办法]
用到队列 自己看吧
[解决办法]
双向指针链表构建树 然后遍历
------解决方案--------------------


使用队列,类似于广度优先搜索
[解决办法]
队列,广度遍历
[解决办法]
从根结点开始,将它的所有子节点按顺序放入队列然后输出根结点;
扩展队列中第一个元素,将它的子节点放入队列然后输出该结点;
重复上面操作直到队列为空!
[解决办法]
广度优先遍历
[解决办法]
队列可以解决
[解决办法]
这个有最简单的方法,用一个Vector存节点,
1,从根开始,现push_back() root,root->left, root->right;
2,然后 pop(), 顺序:root ,root->left ,root->right;关键在这里,没pop()一个节点pTem就push_back() pTem->left. pTem->right
3,如此搞到最后,这是最简单的方法

热点排行