关闭

二叉树的前序遍历、中序遍历、后续遍历 (包括递归、非递归,共六种)

标签: structnullc算法system测试
1107人阅读 评论(0) 收藏 举报
分类:

二叉树的前序遍历、中序遍历、后续遍历

(包括递归、非递归,共六种)

如有不当之处,望指正!!!

微笑


1、前序遍历(递归):

     算法实现一:

       #include <stdio.h>

#include <stdlib.h>

typedef struct BiTNode//定义结构体

{

       char data;

       struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

void CreateBiTree(BiTree &T) //前序创建树

{

              char ch;

              scanf("%c",&ch);

              if(ch==' ')  T=NULL;

              else

              {

                     T=(struct BiTNode*)malloc(sizeof(struct BiTNode));

                     T->data=ch;

                     CreateBiTree(T->lchild);

                     CreateBiTree(T->rchild);

              }

}

int print(BiTree T)//前序遍历(输出二叉树)

{

              if(T==NULL)return 0;

              else  if(T->lchild==NULL&& T->rchild==NULL)return 1;

              else   returnprint(T->lchild)+print(T->rchild);

}

void main()//主函数

{

              BiTree T;

              CreateBiTree(T);

              printf("%d\n",print(T));

}

 

 

 

     算法实现二:

 

#include<stdio.h>

#include<stdlib.h>

struct BiTNode//定义结构体

{

    char data;

    structBiTNode *lchild,*rchild;

};

int num=0;

void CreatBiTree(struct BiTNode *&p) //前序创建树

{

       char ch;

       scanf("%c",&ch);

       if(ch==' ') p=NULL;

       else

       {

              p=(struct BiTNode *)malloc(sizeof(struct BiTNode));

              p->data=ch;

              CreatBiTree(p->lchild);

 

              CreatBiTree(p->rchild);

       }

}

void print(struct BiTNode *p) //前序遍历(输出二叉树)

{

       if(p!=NULL)

       {

              if(p->lchild==NULL&&p->rchild==NULL)

              else

              {

                     print(p->lchild);

                     print(p->rchild);

              }

       }

}

void main()//主函数

{

       struct BiTNode *p;

       CreatBiTree(p);

       print(p);

       printf("%d\n",num);

}

2、中序遍历(递归):

#include<stdio.h>

#include<stdlib.h>

struct BiTNode//定义结构体

{

    char data;

    struct BiTNode *lchild,*rchild;

};

void later(struct BiTNode *&p) //前序创建树

{

       char ch;

       scanf("%c",&ch);

       if(ch==' ')

              p=NULL;

       else

       {

              p=(struct BiTNode *)malloc(sizeof(struct BiTNode));

              p->data=ch;

              later(p->lchild);

              later(p->rchild);

       }

}

void print(struct BiTNode *p) //中序遍历(输出二叉树)

{

       if(p!=NULL)

       {

              print(p->lchild);

              printf("%c",p->data);

              print(p->rchild);

       }

       else

              printf(" ");

}

void main()//主函数

{

       struct BiTNode *p;

       later(p);

       print(p);

}

 

 

 

 

3、后序遍历(递归):

#include<stdio.h>

#include<stdlib.h>

struct BiTNode//定义结构体

{

    char data;

    struct BiTNode *lchild,*rchild;

};

void later(structBiTNode *&p)//前序创建树

{

       char ch;

       scanf("%c",&ch);

       if(ch==' ')

              p=NULL;

       else

       {

              p=(struct BiTNode*)malloc(sizeof(struct BiTNode));

              p->data=ch;

              later(p->lchild);

              later(p->rchild);

       }

}

void print(structBiTNode *p)//后序遍历(输出二叉树)

{

       if(p!=NULL)

       {

              print(p->lchild);

              print(p->rchild);

              printf("%c",p->data);

       }

       else

              printf("");

}

void main()//主函数

{/*检测:printf("到了吗");*/

       struct BiTNode *p;

       later(p);

       print(p);

}

 

 

 

 

4、前序遍历(非递归):

#include<stdio.h>

#include<stdlib.h>

struct BiTNode*stack[100];

struct BiTNode//定义结构体

{

    char data;

    struct BiTNode *lchild,*rchild;

};

void later(structBiTNode *&p)//前序创建树

{

       char ch;

       scanf("%c",&ch);

       if(ch==' ')

              p=NULL;

       else

       {

              p=(struct BiTNode*)malloc(sizeof(struct BiTNode));

              p->data=ch;

              later(p->lchild);

              later(p->rchild);

       }

}

void print(structBiTNode *p)//前序遍历(输出二叉树)

{

       int i=-1;

       while(1)

       {

              while(p!=NULL)

              {

                     stack[++i]=p->rchild;/*printf("ok?\n");*/

                     printf("%c",p->data);

                     p=p->lchild;

              }

              if(i!=-1)

              {

                     p=stack[i];

                     i--;

              }

              else

                     return;

       }

}

void main()//主函数

{

       struct BiTNode *p,*t;

       later(p);

       print(p);

}

 

 

 

5、中序遍历(非递归)

#include<stdio.h>

#include<stdlib.h>

struct BiTNode*stack[100];

struct BiTNode//定义结构体

{

    chardata;

    struct BiTNode *lchild,*rchild;

};

void later(structBiTNode *&p)//前序创建树

{

       char ch;

       scanf("%c",&ch);

       if(ch==' ')

              p=NULL;

       else

       {

              p=(struct BiTNode*)malloc(sizeof(struct BiTNode));

              p->data=ch;

              later(p->lchild);

              later(p->rchild);

       }

}

void print(structBiTNode *p)//中序遍历(输出二叉树)

{

       int i=-1;

       while(1)

       {

              while(p!=NULL)

              {

                     i++;

                     stack[i]=p;

                     p=p->lchild;

              }

              if(i!=-1)

              {

                     p=stack[i];

                     i--;

                     printf("%c",p->data);

                     p=p->rchild;

              }

       }

}

void main()//主函数

{

       struct BiTNode *p;

       later(p);

       print(p);

}

 

6、后续遍历(非递归):

#include<stdio.h>

#include<stdlib.h>

struct BiTNode*stack[100];

struct BiTNode//定义结构体

{

    char data;

    structBiTNode *lchild,*rchild;

};

void later(structBiTNode *&p)//前序创建树

{

       char ch;

       scanf("%c",&ch);

       if(ch==' ')

              p=NULL;

       else

       {

              p=(struct BiTNode*)malloc(sizeof(struct BiTNode));

              p->data=ch;

              later(p->lchild);

              later(p->rchild);

       }

}

void print(structBiTNode *p)//后序遍历(输出二叉树)

{

       int i=-1;

       while(1)

       {

              while(p!=NULL)

              {

                     stack[++i]=p;/*printf.0("ok?\n");*/

                     p=p->lchild;

              }

              if(i!=-1)

              {

            while(p==stack[i]->rchild||(p==stack[i]->lchild&&stack[i]->rchild==NULL))

            {

                p=stack[i--];

               printf("%c",p->data);

                if(i==-1)

                         return;

            }

           p=stack[i]->rchild;

              }

              else

                     return;

       }

}

int main()//主函数

{

       struct BiTNode *p,*t;

       later(p);

       print(p);

       printf("\n");

       system("pause");

       return 0;

}

 

供测试使用的数据

前序创建二叉树

中序

后序

/*AB D  C  */

 

BDAC

DBCA

/*ABC  D  EF  G  */

 

CBDAFEG

CDBFGEA

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:10706次
    • 积分:194
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:3篇
    • 译文:0篇
    • 评论:2条
    最新评论