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

原创 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;
}

剑指offer之求二叉树的深度(非递归的层次遍历)Java实现

非递归层次遍历 求解二叉树的深度、最大层数、某层的某个节点问题。

二叉树的非递归层次遍历

#include #include #include using namespace std;typedef struct Node { char data; Node*lchild;...

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

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

用递归方法对二叉树进行层次遍历

用递归方法对二叉树进行层次遍历       在这里看到了这个题。层次遍历是用队列,一级一级地入队列然后输出。而用递归的话,我首先想到是用两个栈来模拟队列,在递归遍历二叉树的过程中入栈,然后最...

数据结构:二叉树(前,中,后,层次)非递归遍历。

#include #include #include #include #include using namespace std;struct Node { char data; ...

二叉树的非递归前序、中序、后序、层次遍历

1.前序非递归 /*非递归前序遍历*/ void PreOrderNonRecurive(TreeNode *root) { if (!root) return; stack s; s.push...

用递归方法对二叉树进行层次遍历

在这里看到了这个题。层次遍历是用队列,一级一级地入队列然后输出。而用递归的话,我首先想到是用两个栈来模拟队列,在递归遍历二叉树的过程中入栈,然后最后一次性出栈。但仔细思考后发现无法做到层次遍历。在这里...

二叉树第K层的第M个节点 -- 采用非递归层次遍历实现

/*二叉树第K层的第M个节点 -- 采用非递归层次遍历实现 经调试可运行源码及分析如下: ***/ #include #include #include using std::cout; usin...

二叉树非递归前序,中序,后序,层次遍历

这个说明网上非常多,就直接上代码了。 #include #include #include #include using namespace std; struct BinaryTre...

二叉树的创建,以及递归前中后序以及层次遍历

#include using namespace std; typedef char ElemType ; typedef struct Node { ElemType data; struc...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树的递归遍历以及层次遍历
举报原因:
原因补充:

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