您的位置:首页 > 其它

第十一周项目1(1)层次遍历算法验证

2016-11-05 09:18 375 查看
#ifndef BTREE_H_INCLUDED

#define BTREE_H_INCLUDED

/*

*烟台大学计控学院

*作 者:邹晓琳

*完成日期:2016年11月5日

*问题描述:实现二叉树的层次遍历算法,并对用”A(B(,D(,G)),C(E,F))”创建的二叉树进行测试

*/

#endif // BTREE_H_INCLUDED

(1)btree.h

#ifndef BTREE_H_INCLUDED

#define BTREE_H_INCLUDED

#define MaxSize 100

typedef char ElemType;

typedef struct node

{

ElemType data; //数据元素

struct node *lchild; //指向左孩子

struct node *rchild; //指向右孩子

} BTNode;

void CreateBTNode(BTNode *&b,char *str); //由str串创建二叉链

BTNode *FindNode(BTNode *b,ElemType x); //返回data域为x的节点指针

BTNode *LchildNode(BTNode *p); //返回*p节点的左孩子节点指针

BTNode *RchildNode(BTNode *p); //返回*p节点的右孩子节点指针

int BTNodeDepth(BTNode *b); //求二叉树b的深度

void DispBTNode(BTNode *b); //以括号表示法输出二叉树

void DestroyBTNode(BTNode *&b); //销毁二叉树

void LevelOrder(BTNode *b);

#endif // BTREE_H_INCLUDED

(2)btree.cpp

#include <stdio.h>

#include <malloc.h>

#include "btree.h"

void CreateBTNode(BTNode *&b,char *str) //由str串创建二叉链

{

BTNode *St[MaxSize],*p=NULL;

int top=-1,k,j=0;

char ch;

b=NULL; //建立的二叉树初始时为空

ch=str[j];

while (ch!='\0') //str未扫描完时循环

{

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) //p指向二叉树的根节点

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) //返回data域为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) //返回*p节点的左孩子节点指针

{

return p->lchild;

}

BTNode *RchildNode(BTNode *p) //返回*p节点的右孩子节点指针

{

return p->rchild;

}

int BTNodeDepth(BTNode *b) //求二叉树b的深度

{

int lchilddep,rchilddep;

if (b==NULL)

return(0); //空树的高度为0

else

{

lchilddep=BTNodeDepth(b->lchild); //求左子树的高度为lchilddep

rchilddep=BTNodeDepth(b->rchild); //求右子树的高度为rchilddep

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 LevelOrder(BTNode *b)

{BTNode *p;

BTNode *qu[MaxSize]; //定义环形队列,存放节点指针

int front,rear; //定义队头和队尾指针

front=rear=-1; //置队列为空队列

rear++;

qu[rear]=b;

while(front!=rear)

{

front=(front+1)%MaxSize;

p=qu[front];//队头出队列

printf("%c ",p->data); //访问节点

if(p->lchild!=NULL)

{

rear=(rear+1)%MaxSize;

qu[rear]=p->lchild;

}

if(p->rchild!=NULL)

{

rear=(rear+1)%MaxSize;

qu[rear]=p->rchild;

}

}

}

(3)main.cpp

#include<stdio.h>

#include"btree.h"

int main()

{

BTNode *b;

CreateBTNode(b,"A(B(,D(,G)),C(E,F))");

printf("二叉树b: ");

DispBTNode(b);

printf("\n");

printf("层次遍历序列:\n");

LevelOrder(b);

DestroyBTNode(b);

return 0;

}

运行结果:





知识点总结:

层次遍历的算法:先将根节点进队,在队不空时循环,在队列中出列一个节点*p,访问它;若它有左孩子节点将左孩子节点进队;若有右孩子则将右孩子进队,直到队空为止。

学习心得:

对照图看很容易就能理解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编辑语言 二叉树