第十一周项目1--二叉树算法验证(1)
2015-11-09 16:34
316 查看
问题及代码:
btree.h
btree.cpp
运行结果:
学习心得:上周用超链接写了几篇博客,最后发现还是老老实实把代码全都发上去吧,主要以后看的时候不用看两个页面了
/* *Copyright(c) 2015, 烟台大学计算机学院 *All rights reserved. *文件名称:层次遍历算法的验证.cpp *作 者:杜文文 *完成日期:2015年 11月 9日 *问题描述:实现二叉树的层次遍历算法,并对用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”创建的二叉树进行测试。 */
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); 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); #endif // BTREE_H_INCLUDED
btree.cpp
#include <stdio.h> #include "btree.h" #include <malloc.h> 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; } } } 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 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); } } 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("层次遍历序列:"); printf("\n"); LevelOrder(b); DestroyBTNode(b); return 0; }
运行结果:
学习心得:上周用超链接写了几篇博客,最后发现还是老老实实把代码全都发上去吧,主要以后看的时候不用看两个页面了
相关文章推荐
- Dynamics CRM 通过PowerShell启用AllowDeclarativeWorkflows即自定义XAML WorkFlows
- Dynamics CRM 通过PowerShell启用AllowDeclarativeWorkflows即自定义XAML WorkFlows
- Dynamics CRM 通过PowerShell启用AllowDeclarativeWorkflows即自定义XAML WorkFlows
- 2015-11-9 java 微信端JSSDK分享实现
- iOS+Python+Appium真机自动化测试实战
- php抽奖程序
- 百度云推送10101错误
- 第10周 项目3 - 利用二叉树遍历思想解决问题
- 反射事例代码
- 第十一周--【项目1 - 二叉树算法验证】
- epoll和select区别
- 流API--流的收集
- 怎样保护“/tmp/mysql.sock ”不被删除
- Your project contains error(s) please fix them ...... android创建第一个项目报错与解决办法
- C++常用string函数
- 流API--流的收集
- Win8系统换Win7前格式化磁盘需要做的事情。
- ListView之头部浮动效果
- 为什么现在改用int.TryParse了
- linux select 与 阻塞( blocking ) 及非阻塞 (non blocking)实现io多路复用的示例