| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 795 人关注过本帖
标题:帮帮忙,把先序遍历变成递归的先序遍历
只看楼主 加入收藏
xy2bl
Rank: 1
等 级:新手上路
帖 子:61
专家分:2
注 册:2010-12-2
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
帮帮忙,把先序遍历变成递归的先序遍历
#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
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
void PreOrderTraverse(BiTree T)
{
    if(T!=NULL)
    {
        printf("%c_  ",T->data);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}

这就是递归
2010-12-10 16:19
xy2bl
Rank: 1
等 级:新手上路
帖 子:61
专家分:2
注 册:2010-12-2
收藏
得分:0 
晕,我写错了,是非递归的
2010-12-10 16:28
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
这个问题 前面的帖有回答  
 
2010-12-10 16:50
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
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:10 
完成栈的结构定义 和 相关的操作函数定义
sqstack
Inintstack(&s);
Push(&s,root);
Empty(&s)
Pop(&s,b);
2010-12-11 13:06
xy2bl
Rank: 1
等 级:新手上路
帖 子:61
专家分:2
注 册:2010-12-2
收藏
得分:0 
T定义有问题;
在定义T前缺少);这个问题我遇到过好多次
     
2010-12-11 13:26
wangting121
Rank: 2
等 级:论坛游民
帖 子:12
专家分:34
注 册:2010-11-28
收藏
得分:10 
//递归实现二叉树的3种遍历
#include<iostream.h>
typedef char elemtype;

//定义二叉树数据类型
typedef struct BiTNode
{
    elemtype data;   //结点信息
    BiTNode *lchild,*rchild; //左右孩子
}BiTNode,*BiTree;

//建立二叉链表
void CreateBiTree(BiTree &T)   
{
    BiTNode *s=NULL, *q[100];            //q为队列,最大空间为100
    int front=1,rear=0;                    //队列头、尾指针
    char ch;
    cout<<"请输入结点值(','为虚结点,'#'结束);"<<endl;
    cin>>ch;
    while(ch!='#')
    {
        s=NULL;
        if(ch!=',')
        {
            s=new BiTNode;
            s->data=ch;
            s->lchild=NULL;
            s->rchild=NULL;
        }
        rear++;
        q[rear]=s;    //进队
        if(rear==1)
            T=s;
        else
        {
            if((s!=NULL)&&(q[front]!=NULL))
            {
                if(rear%2==0)
                    q[front]->lchild=s;
                else
                    q[front]->rchild=s;
            }
            if(rear%2==1)
            {   
                front++;    //出队
            }
        }
        cin>>ch;
    }
}


//用非递归实现二叉树的3种遍历,部分遍历程序如下:
void PreOrderTraverse(BiTree T)   //先序遍历
{
    BiTNode *p,*s[100];       //s为堆栈
    int top=0;               //top为栈顶指针
    p=T;            
    while((p!=NULL)||(top>0))
    {   
        if(p)
        {
            cout<<p->data<<" ";
            s[++top]=p;  //进栈
            p=p->lchild;
        }
        else
        {
            p=s[top--];    //退栈
            p=p->rchild;
        }
        
    }
}

void InOrderTraverse(BiTree T)    //中序遍历
{
    BiTNode *p,*s[100];
    int top=0;
    p=T;
    while((p!=NULL)||(top>0))
    {  
        if(p)
        {
            s[++top]=p;
            p=p->lchild;
        }
        else
        {
            p=s[top--];
            cout<<p->data<<" ";
            p=p->rchild;
        }
    }
}

void PostOrderTraverse(BiTree T)    //中序遍历
{
    BiTNode *p,*s[100];
    int top=0;
    int TagStack[100]={0};
    p=T;
    while((p!=NULL)||(top>0))
    {  
        while(p)
        {
            s[++top]=p;
            p=p->lchild;
        }
        while((top>0)&&(TagStack[top]==1))
        {
            s[++top]=p;
            cout<<p->data<<" ";
        }
        if(top>0)
        {
            TagStack[top]=1;            
            p=s[--top];
            p=p->rchild;
        }
        else
            break;
        
    }
}

// void  PostOrderTraverse(BiTree T)  //后序遍历
// {
//     BiTNode *p, *sl[100];
//     int s2[100],top=0,b;
//     p=T;
//     do
//     {
//         while(p!=NULL)
//         {
//             sl[top]=p;
//             s2[top++]=0;
//             p=p->lchild;
//         }
//         if(top>0)
//         {
//             b=s2[--top];
//             p=sl[top];
//             if(b==0)
//             {
//                 sl[top]=p;
//                 s2[top++]=1;
//                 p=p->rchild;
//             }
//             else
//             {
//                 cout<<p->data<<" ";
//                 p=NULL;
//             }   
//         }
//     }while(top>0);
// }

//按层次遍历二叉树(建立二叉链表同前)
void LevelOrderTraverse(BiTree T)   
{
    BiTNode *q[100],*p;                //q代表队列
    int f,r;                        //f,r类似于队列头、尾指针
    q[1]=T;  
    f=r=1;
    cout<<"按层次遍历二叉树的结果为:";
    while(f<=r)
    {   
        p=q[f];
        f++;                        //出队
        cout<<p->data<<" ";
        if(p->lchild!=NULL)
        {  
            r++;                    //入队
            q[r]=p->lchild;
        }   
        if(p->rchild!=NULL)
        {  
            r++;                    //入队
            q[r]=p->rchild;
        }  
    }
    cout<<endl;
}

//将二叉树的左右子树进行交换
void LeftToRight(BiTree T)
{
    BiTNode  *root=T;
    if (root!=NULL)
    {         
        BiTNode *t=root->lchild;
        root->lchild=root->rchild;
        root->rchild=t;
        LeftToRight(root->lchild);
        LeftToRight(root->rchild);
    }
}

void main()
{
    BiTree T=NULL;
    CreateBiTree(T);
   
    cout<<"先序遍历的结果:"<<endl;
    PreOrderTraverse(T);
    cout<<endl;

    cout<<"中序遍历的结果:"<<endl;
    InOrderTraverse(T);
    cout<<endl;

    cout<<"后序遍历的结果:"<<endl;
    PostOrderTraverse(T);
    cout<<endl;

    cout<<"层次遍历的结果:"<<endl;
    InOrderTraverse(T);
    cout<<endl;

    cout<<endl;
    cout<<"交换二叉树的左右子树"<<endl;
    LeftToRight(T);
    cout<<endl;

    cout<<"交换后的先序遍历的结果:"<<endl;
    PreOrderTraverse(T);
    cout<<endl;
   
    cout<<"交换后的中序遍历的结果:"<<endl;
    InOrderTraverse(T);
    cout<<endl;
   
    cout<<"交换后的后序遍历的结果:"<<endl;
    PostOrderTraverse(T);
    cout<<endl;
   
    cout<<"交换后的层次遍历的结果:"<<endl;
    InOrderTraverse(T);
    cout<<endl;
}

给个 个C++的非递归的~~~~~参考
2010-12-11 18:55
xy2bl
Rank: 1
等 级:新手上路
帖 子:61
专家分:2
注 册:2010-12-2
收藏
得分:0 
很感谢,但我要C语言
2010-12-11 22:02
快速回复:帮帮忙,把先序遍历变成递归的先序遍历
数据加载中...
 
   



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

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