第十一周项目1-验证二叉树算法(1)
来源:互联网 发布:佳能wifi软件app 编辑:程序博客网 时间:2024/05/22 11:03
问题及代码:
/*copyright (t) 2016,烟台大学计算机学院*All rights reserved.*文件名称:1.cpp*作者:常锐*完成日期:2016年11月7日*版本号:v1.0*问题描述:实现二叉树的层次遍历算法,并使用不同测试数据创建二叉树,进行测试。请利用二叉树算法库。*输入描述:二叉树字符串str*程序输出:测试结果*/
btree.h:
#include <stdio.h>#include <malloc.h>#define MaxSize 100typedef 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); //销毁二叉树
btree.cpp:
#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); }}
main.cpp:
#include <stdio.h>#include "btree.h"#define maxlen 1000char str[maxlen]; //定义存放二叉树字符串的数组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; } } printf("\n");}int main(){ BTNode *b; while(gets(str)) { CreateBTNode(b,str); printf("二叉树b: "); DispBTNode(b); printf("\n"); printf("层次遍历序列:\n"); LevelOrder(b); DestroyBTNode(b); fflush(stdin); } return 0;}
运行结果:
知识点总结:
二叉树的层次遍历算法
心得体会:
综合了二叉树与顺序环形队列的知识点,完成整个层次遍历过程:
1. 一层一层进行,先访问的节点其左右孩子也要先访问 --> “先进先出”,使用顺序环形队列
2. 先将根节点进队,在队不空时循环;从队列中出列一个节点 *p并访问;若它有左孩子节点,将左孩子节点进队;若它有右孩子节点,将右孩子节点进队,如此操作直到队空为止。
0 0
- 第十一周项目1--二叉树算法验证(1)
- 第十一周项目1 - 二叉树算法验证(1)
- 第十一周项目1-二叉树算法验证(1)
- 第十一周项目1-验证二叉树算法(1)
- 第十一周项目1-二叉树算法验证(1)
- 【第十一周项目1 - 二叉树算法验证(1)】
- 第十一周 项目1 验证二叉树算法(1)
- 第十一周项目1-验证二叉树算法(1)
- 第十一周项目1--二叉树算法验证(3)
- 第十一周项目1-二叉树算法验证(4)
- 第十一周项目1--二叉树算法验证(4)
- 第十一周项目1 - 二叉树算法验证(2) .
- 第十一周项目1 - 二叉树算法验证(3) .
- 第十一周项目1 - 二叉树算法验证(2)
- 第十一周项目1 - 二叉树算法验证(4)
- 第十一周项目1 - 二叉树算法验证(3)
- 第十一周项目1 - 二叉树算法验证(4)
- 第十一周项目1-验证二叉树算法(2)
- WebView内存泄漏解决方法
- Caffe学习系列——工具篇:计算数据集的图像均值
- 这20个正则表达式,让你少写1,000行代码
- c中角度和弧度的转换
- BZOJ 1045 [HAOI2008] 糖果传递
- 第十一周项目1-验证二叉树算法(1)
- 第一次体验,也是学习也是锻炼!
- Unity 真实物理动力学实时计算
- bzoj1051 [HAOI2006]受欢迎的牛[图论][tarjan缩点]
- SpringMVC环境搭建问题:org.springframework.web.servlet.DispatcherServlet noHandlerFound
- iOS 判断网络连接状态的几种方法
- Android StringUtils-字符串相关工具类
- 最长回文子串
- BZOJ 2763 [JLOI2011]飞行路线