第十一周 项目1-验证算法(2)
2015-11-09 17:19
267 查看
/*
*Copyright(c) 2015, 烟台大学计算机学院
*All rights reserved.
*文件名称:验证算法(2).cpp
*作 者:周洁
*完成日期:2015年 11月9日
*版 本 号:
*
*问题描述:二叉树构造算法的验证。
*输入描述:若干数据
*程序输出:若干数据
*/
代码:
(1)头文件
二叉树算法库
(2)源文件
方法一:由先序序列和中序序列构造二叉树
运行结果:
![](https://img-blog.csdn.net/20151109171052021?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
方法二:由后序序列和中序序列构造二叉树
运行结果:
![](https://img-blog.csdn.net/20151109171052021?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
方法三:由顺序存储结构转为二叉链存储结构
运行结果:
![](https://img-blog.csdn.net/20151109171052021?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
知识点总结:
二叉树构造算法库
*Copyright(c) 2015, 烟台大学计算机学院
*All rights reserved.
*文件名称:验证算法(2).cpp
*作 者:周洁
*完成日期:2015年 11月9日
*版 本 号:
*
*问题描述:二叉树构造算法的验证。
*输入描述:若干数据
*程序输出:若干数据
*/
代码:
(1)头文件
二叉树算法库
(2)源文件
方法一:由先序序列和中序序列构造二叉树
#include <stdio.h> #include <malloc.h> #include "btree.h" BTNode *CreateBT1(char *pre,char *in,int n) /*pre存放先序序列,in存放中序序列,n为二叉树结点个数, 本算法执行后返回构造的二叉链的根结点指针*/ { BTNode *s; char *p; int k; if (n<=0) return NULL; s=(BTNode *)malloc(sizeof(BTNode)); //创建二叉树结点*s s->data=*pre; for (p=in; p<in+n; p++) //在中序序列中找等于*ppos的位置k if (*p==*pre) //pre指向根结点 break; //在in中找到后退出循环 k=p-in; //确定根结点在in中的位置 s->lchild=CreateBT1(pre+1,in,k); //递归构造左子树 s->rchild=CreateBT1(pre+k+1,p+1,n-k-1); //递归构造右子树 return s; } 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(")"); } } } int main() { ElemType pre[]="ABDGCEF",in[]="DGBAECF"; BTNode *b1; b1=CreateBT1(pre,in,7); printf("b1:"); DispBTNode(b1); printf("\n"); return 0; }
运行结果:
方法二:由后序序列和中序序列构造二叉树
#include <stdio.h> #include <malloc.h> #include "btree.h" 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(")"); } } } BTNode *CreateBT2(char *post,char *in,int n) /*post存放后序序列,in存放中序序列,n为二叉树结点个数, 本算法执行后返回构造的二叉链的根结点指针*/ { BTNode *s; char r,*p; int k; if (n<=0) return NULL; r=*(post+n-1); //根结点值 s=(BTNode *)malloc(sizeof(BTNode)); //创建二叉树结点*s s->data=r; for (p=in; p<in+n; p++) //在in中查找根结点 if (*p==r) break; k=p-in; //k为根结点在in中的下标 s->lchild=CreateBT2(post,in,k); //递归构造左子树 s->rchild=CreateBT2(post+k,p+1,n-k-1); //递归构造右子树 return s; } int main() { ElemType in[]="DGBAECF",post[]="GDBEFCA"; BTNode *b2; b2=CreateBT2(post,in,7); printf("b2:"); DispBTNode(b2); printf("\n"); return 0; }
运行结果:
方法三:由顺序存储结构转为二叉链存储结构
#include <stdio.h> #include <malloc.h> #include "btree.h" #define N 30 typedef ElemType SqBTree ; BTNode *trans(SqBTree a,int i) { BTNode *b; if (i>N) return(NULL); if (a[i]=='#') return(NULL); //当节点不存在时返回NULL b=(BTNode *)malloc(sizeof(BTNode)); //创建根节点 b->data=a[i]; b->lchild=trans(a,2*i); //递归创建左子树 b->rchild=trans(a,2*i+1); //递归创建右子树 return(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(")"); } } } int main() { BTNode *b; ElemType s[]="0ABCD#EF#G####################"; b=trans(s,1); printf("b:"); DispBTNode(b); printf("\n"); return 0; }
运行结果:
知识点总结:
二叉树构造算法库
相关文章推荐
- 关于 UIView 的 layoutSubviews 方法
- 【学习OpenCV】仿射变换函数warpAffine、旋转
- 获取Activity的根布局
- IOS AppDelegate.m 详解
- 项目调优-微信(本地化服务)平台:瓶颈定位,数据库调优,业务重构
- servlet中request中的函数
- 自定义ImageView 实现双击放大缩小还原,无极缩小和旋转及拖动(多机型测试很稳定)
- Linux(suse11) 安装 JDK (.gz版本)
- iOS 9 ContactsFramework
- 第九周实践项目~对称矩阵压缩存储的实现与应用(1)
- 第十一周 项目一 验证算法
- DOCTYPE声明作用及用法详解
- 黑马程序员——枚举和动态代理
- (2)二叉树构造算法的验证
- 项目应用中的卡尔曼滤波
- 基于Ubuntu+Apache+Passenger+MySQL的Redmine安装笔记
- 用UIButton实现页面跳转(AppDelegate +NavigationViewController)
- c++ 智能指针用法详解
- nrf51822之间通讯
- java运行时间小程序