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

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

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

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

微笑


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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值