二叉树的递归遍历以及层次遍历

原创 2012年03月29日 12:06:32

#include <stdio.h>
#include <stdlib.h>

#define ERROR 0
#define OK 1

typedef char TElemType;
typedef int Status;


//二叉树的二叉链表存储表示
typedef struct BiTNode
 {
  TElemType data;
  struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

//定义链式队列结点
typedef struct QNode
{
 BiTree Queuedata;
 struct QNode * next;
}QNode,* QueuePtr;
//定义链式队列
typedef struct
{
 QueuePtr front;
 QueuePtr rear;
}LinkQueue;

//按照先序次序构造二叉树
Status CreatBiTree(BiTree &T)
{char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else
{
 if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
  return ERROR;
 T->data=ch;
 CreatBiTree(T->lchild);
 CreatBiTree(T->rchild);
}
return OK;
}
//递归先序遍历二叉树
Status PreOrder ( BiTree T )
{
 if ( T!=NULL)
 {
  printf("%c",T->data); 
  PreOrder ( T->lchild );
  PreOrder ( T->rchild );
 }
 return OK;
}

//递归中序遍历二叉树
Status InOrder ( BiTree T )
{
 if ( T!=NULL)
 {
  InOrder ( T->lchild );
  printf("%c",T->data);
  InOrder ( T->rchild );
 }
 return OK;
}

//递归后序遍历二叉树
Status LastOrder ( BiTree T )
{
 if (T!=NULL)
 {
  LastOrder( T->lchild );
  LastOrder( T->rchild );
  printf("%c",T->data);
 }
 return OK;
}

//初始化一个带头结点的队列
Status InitQueue(LinkQueue &Q)
{
 Q.front=(QNode*)malloc(sizeof(QNode));
 if (!Q.front)
  return ERROR;
 Q.rear=Q.front;
  Q.front->next=NULL;
 return OK;
}

//入队列
Status EnQueue(LinkQueue &Q,BiTree e)
{
 QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
 if (!s)
return ERROR;
 s->Queuedata=e;
 s->next=NULL;
 Q.rear->next=s;
 Q.rear=s;
 return OK;

}
//出队
int DelQueue(LinkQueue &Q, BiTree &e)
{
 char data1;
 QueuePtr s;
 s=Q.front->next;
 e=s->Queuedata;
    data1=e->data;
 Q.front->next=s->next;
 if(Q.rear==s)
  Q.rear=Q.front;
 free(s);
 
 return OK;
}
//队列的判断空操作
Status QueueEmpty(LinkQueue Q)
{
 
 if (Q.front->next==NULL)
    return OK;
 else return ERROR;
 
}
//按层次遍历
Status LevelBiTree(BiTree T)
{
 LinkQueue Q;
 
 InitQueue(Q);
 BiTree p = T;        
 if (T == NULL) return ERROR;
 
 EnQueue(Q,p);
 
 while (!QueueEmpty(Q))     
 {   DelQueue(Q, p);
  printf("%C",p->data);
 
 if (p->lchild) 
  EnQueue(Q, p->lchild);
 if (p->rchild)  
  EnQueue(Q, p->rchild);
 }

return OK;
}

int main()
{BiTree T;
printf("按照先序次序输入二叉树中结点的值.\n");
CreatBiTree(T);
printf("先序遍历二叉树:");
PreOrder(T);printf("\n");
printf("中序遍历二叉树:");
InOrder(T);printf("\n");
printf("后序遍历二叉树:");
LastOrder(T);printf("\n");
printf("按层次遍历二叉树:");
LevelBiTree(T);printf("\n");
return 0;
}

二叉树按层次遍历的递归用法

对于在学数据结构的大家,在编写二叉树的按层次遍历时往往会用非递归的方法,或许有人会问可不可以用递归来做呢? 对此,小编的答案是可以的。 相对于非递归,递归稍微要复杂些(这是由于二叉树中递归左子树递归右...
  • YaoDeBiAn
  • YaoDeBiAn
  • 2016年06月07日 22:15
  • 2565

java数据结构--二叉树,递归遍历,非递归遍历,层次遍历

1.为什么要引入树    线性结构的特点是插入和删除速度慢,查找速度快。    链式结构的特点是查找速度慢,插入和删除速度快。       树型结构综合了线性结构和链式结构优点,查找,删除,插入速度都...
  • ZuoAnYinXiang
  • ZuoAnYinXiang
  • 2015年12月23日 23:09
  • 1012

c语言实现二叉树先序,中序,后序(递归),层次遍历,求叶子节点个数及树的深度,下一篇写非递归的遍历

#include #include #define MAXSIZE 30 typedef char ElemType; typedef struct TNode *BiTree; stru...
  • u014574317
  • u014574317
  • 2017年04月04日 14:50
  • 1522

二叉树概念及递归与非递归遍历

一、数据结构分类 (一)按逻辑结构 集合(无辑关系) 线性结构(线性表):数组、链表、栈、队列 非线性结构:树、图、多维数组 (二)按存储结构 顺序(数组)储结构、链式...
  • wangweixaut061
  • wangweixaut061
  • 2012年01月04日 07:41
  • 2367

计算二叉树宽度——层次遍历

统计利用先序遍历创建的二叉树叶结点的个数(0973) Time limit(ms): 1000 Memory limit(kb): 10000 Submissio...
  • believe__dream
  • believe__dream
  • 2015年04月28日 21:01
  • 1677

如何实现二叉树层次遍历

完整 #include using namespace std; typedef struct biTreeNode { char data; struct biTreeNode *LChild...
  • u014309268
  • u014309268
  • 2014年09月26日 22:47
  • 3761

实现二叉树的先序遍历、中序遍历、后序遍历的递归非递归算法以及层次遍历算法

#include"iostream" #define maxsize 50 using namespace std; class node{ private: char data; node* l...
  • u012651730
  • u012651730
  • 2013年11月19日 22:42
  • 1311

二叉树的创建、二叉排序树、前序、中序、后序、层次遍历

package com.sun.example1; import java.util.LinkedList; import java.util.Queue; class Node { publi...
  • sunshihua12829
  • sunshihua12829
  • 2016年06月14日 19:38
  • 870

LintCode:二叉树的层次遍历 II

LintCode:二叉树的层次遍历 II""" Definition of TreeNode: class TreeNode: def __init__(self, val): ...
  • u012225151
  • u012225151
  • 2016年05月13日 13:19
  • 707

层次遍历的两种方式:递归与迭代

二叉树的层次遍历方式一:递归调用(参考网上的方法),先序遍历递归时多传递一个层次数,按照该层次数保存节点相关值。 private List> resList = new ArrayList>(); ...
  • u012099869
  • u012099869
  • 2015年08月21日 11:38
  • 417
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树的递归遍历以及层次遍历
举报原因:
原因补充:

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