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

原创 2012年03月24日 22:42:41

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

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

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

微笑


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

 

 

二叉树先序、中序、后续遍历递归以及非递归java实现

闲来无事,对二叉树的遍历做个总结,下面是使用java对二叉树遍历的各种实现,与大家分享 public class Main { /** * 递归先序遍历二叉树 * @author zhan...
  • u011824857
  • u011824857
  • 2016年09月21日 22:15
  • 1304

leetcode | 二叉树的前序遍历、中序遍历、后续遍历的非递归实现

Binary Tree Preorder Traversal:https://leetcode.com/problems/binary-tree-preorder-traversal/ Binary...
  • quzhongxin
  • quzhongxin
  • 2015年06月01日 19:20
  • 1390

递归和非递归实现二叉树的后续遍历

非递归实现二叉树的后续遍历,思想是先定义一个带有标记和二叉树节点的类,把类压栈,并且要设置标记,赋值为true,然后出栈,并且改变标记true为false,最后遍历右子树,直到第二次开始出栈,标记是f...
  • jcm666666
  • jcm666666
  • 2016年09月03日 21:24
  • 486

C++实现二叉树前序中序后续遍历的非递归方法总结

前序中序相对简单,不废话,直接代码:
  • njustzj001
  • njustzj001
  • 2014年10月13日 15:16
  • 2478

【LintCode-67】二叉树的中序遍历(Java实现-递归算法/非递归算法)

递归算法代码记录: public List preorderTraversal(TreeNode root) { if(root==null){ retu...
  • YangDongChuan1995
  • YangDongChuan1995
  • 2017年11月07日 17:25
  • 148

二叉树的中序遍历(lintcode)(递归和非递归)

题目来源:lintcode 原题链接:二叉树的中序遍历 题目: 给出一棵二叉树,返回其节点值的后序遍历。 您在真实的面试中是否遇到过这个题?  Yes 样例 给出一棵二叉树 ...
  • lyy_hit
  • lyy_hit
  • 2015年11月19日 22:04
  • 1140

二叉树的前序、中序、后序遍历的非递归方法 python

class TreeNode: def __init__(self,value=None,leftNode=None,rightNode=None): self.value =...
  • l153097889
  • l153097889
  • 2015年09月09日 09:02
  • 2793

树的学习——(递归构建二叉树、递归非递归前序中序后序遍历二叉树、根据前序序列、中序序列构建二叉树)

前言 最近两个星期一直都在断断续续的学习二叉树的数据结构,昨晚突然有点融汇贯通的感觉,这里记录一下吧 题目要求 给定前序序列,abc##de#g##f###,构建二叉树,并且用递归和非递归两种方法...
  • zinss26914
  • zinss26914
  • 2012年12月29日 10:46
  • 7660

二叉树 先序遍历 中序遍历 后续遍历 java实现

二叉树是一种非常重要的数据结构,也是平时面试的时候面试官喜欢出的问题之一。关于二叉树的概念,就不做过多解释,估计各种课本网络上各种资料都充斥着关于二叉树的原理介绍。我们是实战派,原理不在啰嗦,重点看代...
  • bitcarmanlee
  • bitcarmanlee
  • 2016年05月28日 21:22
  • 1745

二叉树的前序、中序、后序三种遍历的六种实现方式(递归、非递归)(C++)

实现语言:C++ 存储方式:链式存储 struct TreeNode{ int val; TreeNode *left; TreeNode *right; ...
  • liujiayu1015
  • liujiayu1015
  • 2016年09月14日 15:26
  • 2916
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树的前序遍历、中序遍历、后续遍历 (包括递归、非递归,共六种)
举报原因:
原因补充:

(最多只允许输入30个字)