层次遍历的非递归算法
上代码(用队列实现)
语言(c++)
#include <iostream>
#include "btree.h"
#include <stdio.h>
using namespace std;
int main()
{
BTNode *p,*q;
char str[MaxSize],m;
printf("\n(1)创建二叉树,请以括号表示法输入二叉树:\n");
gets(str);
CreateBTNode(p,str);
printf("\n(2)输出二叉树:\n");
DispBTNode(p);
printf("\n(3)请输入要查找的结点:");
scanf("%c",&m);
q=FindNode(p,m);
if(q->lchild==NULL)
{
printf(" 无左孩子 ");
}
else
{
printf(" 有左孩子 ");
}
if(q->rchild==NULL)
{
printf(" 无右孩子 ");
}
else
{
printf(" 有右孩子 ");
}
printf("\n(4)二叉树深度:%d\n",BTNodeDepth(p));
printf("\n(5)层次遍历:");
DispBTNodeBefore(p);
printf("\n(6)释放二叉树");
return 0;
}
头文件:
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node *lchild;
struct node *rchild;
} BTNode;
typedef struct{
BTNode *data[MaxSize];
int front,rear;
} SqQueue;
void InitQueue(SqQueue *&q);
void DestroyQueue(SqQueue *&q);
bool QueueEmpty(SqQueue *q);
int QueueLength(SqQueue *q);
bool enQueue(SqQueue *&q, BTNode * e);
bool deQueue(SqQueue *&q, BTNode * &e);
void CreateBTNode(BTNode *&b,char *str);
BTNode *FindNode(BTNode *b,ElemType x);
BTNode *LchildNode(BTNode *p);
BTNode *RchildNode(BTNode *p);
int BTNodeDepth(BTNode *b);
void DispBTNode(BTNode *b);
void DestroyBTNode(BTNode *&b);
void DispBTNodeBefore(BTNode *b);
源文件:
#include <stdio.h>
#include <malloc.h>
#include "btree.h"
void CreateBTNode(BTNode *&b,char *str)
{
BTNode *St[MaxSize],*p;
int top=-1,k,j=0;
char ch;
b=NULL;
ch=str[j];
while(ch!='\0'){
switch(ch){
case '(': top++; St[top]=p;k=1;break;
case ')': top--; break;
case ',':k=2;break;
default:p=(BTNode *) malloc(sizeof(BTNode));
p->data=ch;
p->lchild=p->rchild=NULL;
if(b==NULL){
b=p;
}else{
switch(k){
case 1:St[top]->lchild=p;break;
case 2:St[top]->rchild=p;break;
}
}
}
j++;
ch=str[j];
}
}
BTNode *FindNode(BTNode *b,ElemType x)
{
BTNode *p;
if (b==NULL)
return NULL;
else if (b->data==x)
return b;
else
{
p=FindNode(b->lchild,x);
if (p!=NULL)
return p;
else
return FindNode(b->rchild,x);
}
}
BTNode *LchildNode(BTNode *p)
{
return p->lchild;
}
BTNode *RchildNode(BTNode *p)
{
return p->rchild;
}
int BTNodeDepth(BTNode *b)
{
int lchilddep,rchilddep;
if (b==NULL)
return(0);
else
{
lchilddep=BTNodeDepth(b->lchild);
rchilddep=BTNodeDepth(b->rchild);
return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);
}
}
void DispBTNode(BTNode *b)
{
if (b!=NULL)
{
printf("%c",b->data);
if (b->lchild!=NULL || b->rchild!=NULL)
{
printf("(");
DispBTNode(b->lchild);
if (b->rchild!=NULL) printf(",");
DispBTNode(b->rchild);
printf(")");
}
}
}
void DestroyBTNode(BTNode *&b)
{
if (b!=NULL)
{
DestroyBTNode(b->lchild);
DestroyBTNode(b->rchild);
free(b);
}
}
void InitQueue(SqQueue *&q)
{
q=(SqQueue *)malloc (sizeof(SqQueue));
q->front=q->rear=0;
}
void DestroyQueue(SqQueue *&q)
{
free(q);
}
bool QueueEmpty(SqQueue *q)
{
return(q->front==q->rear);
}
int QueueLength(SqQueue *q)
{
return (q->rear-q->front+MaxSize)%MaxSize;
}
bool enQueue(SqQueue *&q, BTNode * e)
{
if ((q->rear+1)%MaxSize==q->front)
return false;
q->rear=(q->rear+1)%MaxSize;
q->data[q->rear]=e;
return true;
}
bool deQueue(SqQueue *&q, BTNode * &e)
{
if (q->front==q->rear)
return false;
q->front=(q->front+1)%MaxSize;
e=q->data[q->front];
return true;
}
void DispBTNodeBefore(BTNode *b){
BTNode *p;
SqQueue *qu;
InitQueue(qu);
enQueue(qu,b);
while(!QueueEmpty(qu)){
deQueue(qu,p);
printf("%c ",p->data);
if(p->lchild!=NULL){
enQueue(qu,p->lchild);
}
if(p->rchild!=NULL){
enQueue(qu,p->rchild);
}
}
DestroyQueue(qu);
}