第十一周项目1 验证算法(1) 层次遍历算法
2015-11-20 08:31
363 查看
问题与代码
//head.h
//main.cpp
//zdy.cpp
运行结果
![](https://img-blog.csdn.net/20151120091242791?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
知识点总结
层次遍历:在对某一层节点访问完后,再按照对它们的访问次序对各个节点的左、右孩子顺序访问的方式。
因为先访问的会先输出,由此可知我们可以利用队列来进行验证。
/* *Copyright (c) 2015,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:head.h,main.cpp,zdy.cpp *作者:陈梦萍 *完成日期:2015年11月20日 *版本号:v1.0 * *问题描述: 实现二叉树的层次遍历算法,并对用"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))" 创建的二叉树进行测试 *输入描述:无 *程序输出:若干数据 */
//head.h
#include <stdio.h> #include <malloc.h> #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串创建二叉链 void DestroyBTNode(BTNode *&b); //销毁二叉树 void DispBTNode(BTNode *b); void LevelOrder(BTNode * b);
//main.cpp
#include"head.h" int main() { BTNode *b; CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))"); printf("二叉树b: "); DispBTNode(b); printf("\n"); printf("层次遍历序列:\n"); LevelOrder(b); DestroyBTNode(b); return 0; }
//zdy.cpp
#include "head.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]; } } void DestroyBTNode(BTNode *&b) //销毁二叉树 { if (b!=NULL) { DestroyBTNode(b->lchild); DestroyBTNode(b->rchild); free(b); } } 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 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; } } }
运行结果
知识点总结
层次遍历:在对某一层节点访问完后,再按照对它们的访问次序对各个节点的左、右孩子顺序访问的方式。
因为先访问的会先输出,由此可知我们可以利用队列来进行验证。
相关文章推荐
- 第十一周项目1 - 二叉树算法验证(4)
- 第十一周项目1-验证算法(1)层次遍历算法的验证
- 第十一周项目1(4)验证算法 哈夫曼编码的算法验证
- 第十一周项目1 - 二叉树算法验证(2)
- 我在华为做敏捷测试的那些流程
- 第12周项目1-图基本算法库
- 第六周项目3-括号的匹配
- 第十一周项目1-验证算法(2)二叉树构造算法的验证
- 第12周项目3——图遍历算法实现
- 第11周项目1-验证算法(2)二叉树构造算法的验证
- 第11周项目1-验证算法(3)中序线索化二叉树的算法验证
- 第11周 项目1 - 二叉树算法验证(3)
- 从大数据菜鸟走上大师的历程
- 第12周 项目4(5)-输出通过一个节点的所有简单回路
- 项目1图基本算法库
- 第12周上机实践项目4 - 利用遍历思想求解图问题(1-4)
- 联想VIBE UI 固件ROM刷机包集合
- 第十二周实践项目5—迷宫问题
- 第九周 项目1-猴子选大王
- 第十一周项目1—验证算法(3)中序线索化二叉树的算法验证