| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 795 人关注过本帖
标题:帮帮忙,把先序遍历变成递归的先序遍历
取消只看楼主 加入收藏
xy2bl
Rank: 1
等 级:新手上路
帖 子:61
专家分:2
注 册:2010-12-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
帮帮忙,把先序遍历变成递归的先序遍历
#include "stdio.h"
#include "stdlib.h"

#define MAXSIZE 215

typedef char TElemType;
typedef int Status;

typedef struct bitree
{
    TElemType data;
    struct bitree *lchild,*rchild;
}BiTNode, *BiTree;

BiTree Create_Tree()
{
    BiTree T;
    char a;
    scanf("%s",&a);
    if(a=='#')
        T=NULL;
    else
    {
        T= (BiTNode*) malloc (sizeof(BiTNode));
        T->data = a;
        printf("输入左孩子的值\n");
        T->lchild = Create_Tree();
        printf("输入右孩子的值\n");
        T->rchild = Create_Tree();
    }

    return T;
}

void PreOrderTraverse(BiTree T)
{
    if(T!=NULL)
    {
        printf("%c_  ",T->data);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}

Status PrintElement(TElemType e)
{
    printf("%c", e);

    return 1;
}   
void InOrderTraverse(BiTree T)
{
    if(T!=NULL)
    {
        InOrderTraverse(T->lchild);
        printf("%c_  ",T->data);
        InOrderTraverse(T->rchild);
    }
}
void PostOrderTraverse(BiTree T)
{
    if(T!=NULL)
    {
        PostOrderTraverse(T->lchild);        
        PostOrderTraverse(T->rchild);
        printf("%c_  ",T->data);
    }  
}
void LevelOrder(BiTNode *bt) /*层次遍历二叉树bt*/   
{
    BiTNode* queue[MAXSIZE];
    int front,rear;
    if (bt==NULL)
        return;
     front=0;      /*非循环队列*/
     rear=0;
     queue[rear++]=bt;
     while(front!=rear)
     {
         printf("%c_",queue[front]->data);        /*访问队首结点的数据域*/
         if (queue[front]->lchild!=NULL)   /*将队首结点的左孩子指针入队列*/
         {  
             queue[rear]=queue[front]->lchild;
             rear++;
         }
         if (queue[front]->rchild!=NULL)   /*将队首结点的右孩子指针入队列*/
         {  
             queue[rear]=queue[front]->rchild; rear++;
         }
      front++;
   } /* while */
}/* LevelOrder*/
int main()
{
    BiTree root;
    root=Create_Tree();

    printf("\n先序遍历");
    PreOrderTraverse(root);

    printf("\n中序遍历");
    InOrderTraverse(root);

    printf("\n后序遍历");
    PostOrderTraverse(root);

    printf("\n层次遍历");
    LevelOrder(root);

    printf("\n");
   
    return 0;
}

版主啊,帮我把先序遍历变成递归的先序遍历
搜索更多相关主题的帖子: 遍历 递归 
2010-12-10 16:05
xy2bl
Rank: 1
等 级:新手上路
帖 子:61
专家分:2
注 册:2010-12-2
收藏
得分:0 
晕,我写错了,是非递归的
2010-12-10 16:28
xy2bl
Rank: 1
等 级:新手上路
帖 子:61
专家分:2
注 册:2010-12-2
收藏
得分:0 
#include "stdio.h"
#include "stdlib.h"

#define MAXSIZE 215

typedef char TElemType;
typedef int Status;

typedef struct bitree
{
    TElemType data;
    struct bitree *lchild,*rchild;
}BiTNode, *BiTree;

BiTree Create_Tree()
{
    BiTree T;
    char a;
    scanf("%s",&a);
    if(a=='#')
        T=NULL;
    else
    {
        T= (BiTNode*) malloc (sizeof(BiTNode));
        T->data = a;
        printf("输入左孩子的值\n");
        T->lchild = Create_Tree();
        printf("输入右孩子的值\n");
        T->rchild = Create_Tree();
    }

    return T;
}

void Preorder(Bitree root)
{
   sqstack s;
   Bitree p,b;
   Inintstack(&s);
   Push(&s,root);
   while(Empty(&s))
   {
       if(root==NULL)printf("树为空树\n");
       while(Gettop(s,&p)&&p){printf("%c",p->data);Push(&s,p->Lchild);}
       Pop(&s,b);
       if(Empty(&s)){Pop(&s,b);Push(&s,b->Rchild);}
   }        
}
void InOrderTraverse(BiTree T)
{
    if(T!=NULL)
    {
        InOrderTraverse(T->lchild);
        printf("%c_  ",T->data);
        InOrderTraverse(T->rchild);
    }
}
void PostOrderTraverse(BiTree T)
{
    if(T!=NULL)
    {
        PostOrderTraverse(T->lchild);        
        PostOrderTraverse(T->rchild);
        printf("%c_  ",T->data);
    }  
}
void LevelOrder(BiTNode *bt) /*层次遍历二叉树bt*/   
{
    BiTNode* queue[MAXSIZE];
    int front,rear;
    if (bt==NULL)
        return;
     front=0;      /*非循环队列*/
     rear=0;
     queue[rear++]=bt;
     while(front!=rear)
     {
         printf("%c_",queue[front]->data);        /*访问队首结点的数据域*/
         if (queue[front]->lchild!=NULL)   /*将队首结点的左孩子指针入队列*/
         {  
             queue[rear]=queue[front]->lchild;
             rear++;
         }
         if (queue[front]->rchild!=NULL)   /*将队首结点的右孩子指针入队列*/
         {  
             queue[rear]=queue[front]->rchild; rear++;
         }
      front++;
   } /* while */
}/* LevelOrder*/
int main()
{
    BiTree root;
    root=Create_Tree();

    printf("\n先序遍历");
    PreOrderTraverse(root);

    printf("\n中序遍历");
    InOrderTraverse(root);

    printf("\n后序遍历");
    PostOrderTraverse(root);

    printf("\n层次遍历");
    LevelOrder(root);

    printf("\n");
   
   
}

2010-12-11 12:44
xy2bl
Rank: 1
等 级:新手上路
帖 子:61
专家分:2
注 册:2010-12-2
收藏
得分:0 
版主,我把它变成非递归了
帮我改下错误吧
2010-12-11 12:45
xy2bl
Rank: 1
等 级:新手上路
帖 子:61
专家分:2
注 册:2010-12-2
收藏
得分:0 
T定义有问题;
在定义T前缺少);这个问题我遇到过好多次
     
2010-12-11 13:26
xy2bl
Rank: 1
等 级:新手上路
帖 子:61
专家分:2
注 册:2010-12-2
收藏
得分:0 
很感谢,但我要C语言
2010-12-11 22:02
快速回复:帮帮忙,把先序遍历变成递归的先序遍历
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018856 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved