学数据结构括号匹配问题时遇到了一个问题,是有关二叉树建立问题的,请高手解答下

2013春 数据结构(二)试卷真题_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
2013春 数据结构(二)试卷真题
&&上海大学数据结构二真题
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩9页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢C++二叉树结构的建立与基本操作
字体:[ ] 类型:转载 时间:
二叉树是数据结构中的树的一种特殊情况,有关二叉树的相关概念,这里不再赘述,如果不了解二叉树相关概念,建议先学习数据结构中的二叉树的知识点
准备数据定义二叉树结构操作中需要用到的变量及数据等。 代码如下:#define MAXLEN 20&&&&//最大长度typedef char DATA;&&&&//定义元素类型struct &CBTType&&&&&&&&&&&&&&&&&& //定义二叉树结点类型 {&DATA&&&&&&&&&& //元素数据 &CBTType *&&&&//左子树结点指针 &CBTType *&&&//右子树结点指针 };定义二叉树结构数据元素的类型DATA以及二叉树结构的数据结构CBTType。结点的具体数据保存在一个姐都DATA中,而指针left用来指向左子树结点,指针right用来指向右子树结点
初始化二叉树初始化二叉树,将一个结点设置为二叉树的根结点。 代码如下:CBTType * InitTree(){&CBTType *&if(node = new CBTType)&&//申请内存 &{&&cout&&"请先输入一个根节点数据:"&&&&cin&&node-&&&node-&left=NULL;&&node-&right=NULL;&&if(node!=NULL)&&&//如果二叉树结点不为空 &&{&&&&&&&} else&&{&&&return NULL;&&}&}&return NULL;}首先申请一个结点,然后用户输入根结点 的数据,并将左子树和右子树的指针置为空,即可完成二叉树的初始化工作。
查找结点就是遍历二叉树中的每一个节点,逐个比较数据,当找到目标数据时将返回该数据所在结点的指针。 代码如下:CBTType *TreeFindNode(CBTType *treeNode,DATA data){&CBTType *&if(treeNode==NULL)&{&&return NULL;&}else&{&&if(treeNode-&data==data)&&{&&&return treeN&&}&&else&&&&&&&&//分别向左右子树查找&&&&&{&&&if(ptr=TreeFindNode(treeNode-&left,data))&&//左子树递归查找 &&&{&&&&&&&}&&&else if(ptr=TreeFindNode(treeNode-&right,data))&&&&&&&& //右子树递归查找 &&&{&&&&&&&}&&&else&&&{&&&&return NULL;&&&}&&}&} } 输入参数treeNode为待查找的二叉树的根结点,输入参数data为待查找的结点数据。程序中首先判断根结点是否为空,然后根据数据判断是否为根结点,然后分别向左右子树进行查找,采用递归的方法进行查找,查找到该结点则返回结点对应的指针;如果全都查找不到,则返回NULL。
添加结点添加结点就是在二叉树中添加结点数据,添加结点时除了要输入结点数据外,还需要指定其父结点,以及添加的结点作为左子树还是右子树。然后将该结点置为其父结点的左子树或者右子树。 代码如下:void AddTreeNode(CBTType *treeNode){&CBTType *pnode,*&DATA&&if(pnode=new CBTType)&&&&&//分配内存 &{&&cout&&"输入二叉树结点数据:"&&&&cin&&pnode-&&&pnode-&left=NULL;&&&&&//设置左子树为空 &&pnode-&right=NULL;&&&&&//设置左子树为空 &&cout&&"输入该结点的父结点数据"&&&&cin&&&&parent=TreeFindNode(treeNode,data);//查找父结点,获得结点指针 &&if(!parent)&&{&&&cout&&"没有找到父结点"&&&&&&&&&&}&&cout&&"1.添加该结点到左子树;2.添加该结点到右子树。请输入操作对应的数字。"&&&&do&&{&&&cin&&&&&if(menusel=='1'||menusel=='2')&&&{&&&&switch(menusel)&&&&{&&&&&case '1':&&&&&//添加结点到左子树 &&&&&&if(parent-&left)&&&&&&&&&&&&&&&& //左子树不为空&&&&&&{&&&&&&&cout&&"左子树结点不为空"&& &&&&&&} &&&&&&else&&&&&&{&&&&&&&parent-&left=&&&&&&&cout&&"数据添加成功!"&&&&&&&&}&&&&&&&&&&&case '2':&&&&&//添加结点到右子树 &&&&&&if(parent-&right)&&&&&&&&&&&&&&&& //右子树不为空&&&&&&{&&&&&&&cout&&"右子树结点不为空"&&&&&&&&} &&&&&&else&&&&&&{&&&&&&&parent-&right=&&&&&&&cout&&"数据添加成功!"&& &&&&&&} &&&&&&&&&&&default:&&&&&&cout&&"子节点选择error!"&&&&&&&&&&&&} &&&}&&}while(menusel!='1'&&menusel!='2');&}} 输入参数treeNode为二叉树的根结点,传入根节点是为了方便查找父结点。程序中首先申请内存,然后由用户输入二叉树结点数据,并设置左右子树为空。接着指定其父结点,将其置为左子树或者右子树。
计算二叉树的深度计算二叉树深度就是计算二叉树中结点的最大层数,这里往往需要采用递归算法来实现。 代码如下:int TreeDepth(CBTType *treeNode){&int depleft,&if(treeNode==NULL)&{&&return 0;&&&&&//结点为空的时候,深度为0 &}&else&{&&depleft=TreeDepth(treeNode-&left);&&//左子树深度(递归调用)&&depright=TreeDepth(treeNode-&right);&&&&&&&& //右子树深度(递归调用)&&if(depleft)&&{&&&return ++&&}&&else &&{&&&return ++&&} &}} 输入参数treeNode为待计算的二叉树的根结点。首先判断根节点是否为空,然后分别按照递归调用来计算左子树深度和右子树深度,从而完成整个二叉树深度的计算。
显示结点数据 代码如下:void ShowNodeData(CBTType *treeNode){&cout&&treeNode-&data&&"\t";&&&&&//直接输出结点数据 } 输入参数为需要显示的结点的指针。
清空二叉树清空二叉树就是将二叉树变成一个空树,这里也需要使用递归算法来实现。 代码如下:void ClearTree(CBTType *treeNode){&if(treeNode)&&&&&&&&//判断当前树不为空 &{&&ClearTree(treeNode-&left);&&&&&&&&&&& //清空左子树&&ClearTree(treeNode-&right);&&&&&&&&&&& //清空右子树&&delete treeN&&&&&&//释放当前结点所占用的内存&&}} 输入参数treeNode为待清空的二叉树的根节点。程序中按照递归的方法清空左子树和右子树以及根节点,释放结点占用的内存空间,从而完成清空操作。
遍历二叉树遍历二叉树就是逐个查找二叉树中所有的结点,这里为了直观的显示查找的结果,将会按照查找的顺序,依次输出对应的结点 。
按层遍历算法按层遍历算法是最直观的算法。即:首先输出第一层即根结点,然后输出第一个结点的左右子数,也就是第二层……这样循环处理,就可以逐层遍历,一层一层按照从上到下,从左到右的顺序输出结点。 代码如下:void LevelTree(CBTType *treeNode){&CBTType *p;&CBTType *q[MAXLEN];&&&&&&&//定义一个队列 &int head=0,tail=0;&if(treeNode)&&&&&&&&//如果队首指针不为空&{&&tail=(tail+1)%MAXLEN;&&&&&&&&&&&& //计算循环队列队尾序号&&q[tail]=treeN&&&&&&//二叉树根指针进入队列 &&while(head!=tail)&&{&&&head=(head+1)%MAXLEN;&&&&&&&&&&& //计算循环队列的队首序号&&&p=q[head];&&&&&&//获取队首元素&&&ShowNodeData(p);&&&&&//输出队首元素&&&if(p-&left!=NULL)&&&&&//如果存在左子树&&&{&&&&tail=(tail+1)%MAXLEN;&&&&&&&&&& //计算队列的队尾序号&&&&q[tail]=p-&&&&&//左子树入队 &&&}&&&if(p-&right!=NULL)&&&&&//如果存在右子树&&&{&&&&tail=(tail+1)%MAXLEN;&&&&&&&&&& //计算队列的队尾序号&&&&q[tail]=p-&&&&&//右子树入队 &&&} &&} &} } 输入参数treeNode为需要遍历的二叉树的根结点,程序在整个处理过程中,首先从根节点开始,将每层的结点逐步进入循环队列,并且每次循环都是输出队首的一个结点数据,然后再使它的左右子树进入队列。如此循环直到队列中的所有的数据都输出完毕。
先序遍历算法先序遍历算法就是先访问根节点,然后访问左子树,然后访问右子树。程序中可以按照递归的思想遍历左子树和右子树。 代码如下:void DLRTree(CBTType *treeNode){&if(treeNode)&{&&ShowNodeData(treeNode);&&&&&//显示结点内容&&DLRTree(treeNode-&left);&&&&//显示左子树内容&&DLRTree(treeNode-&right);&&&&//显示右子树内容 &}} 中序遍历算法先序遍历算法就是先访问左子树,然后访问根节点,然后访问右子树。程序中可以按照递归的思想遍历左子树和右子树。 代码如下:void LDRTree(CBTType *treeNode){&if(treeNode)&{
&&LDRTree(treeNode-&left);&&&&//显示左子树内容&&&&&ShowNodeData(treeNode);&&&&&//显示结点内容&&DLRTree(treeNode-&right);&&&&//显示右子树内容 &&&&}&} 后序遍历算法先序遍历算法就是先访问左子树,然后访问右子树,然后访问根节点。程序中可以按照递归的思想遍历左子树和右子树。 代码如下:void LRDTree(CBTType *treeNode){&if(treeNode)&{&&LRDTree(treeNode-&left);&&&&//显示左子树内容&&&DLRTree(treeNode-&right);&&&&//显示右子树内容 &&&&&ShowNodeData(treeNode);&&&&&//显示结点内容&}&} 完整代码示例操作:
在文件中加入头文件,然后包含上述所有函数,然后再写一个main函数即可: 代码如下:#include&iostream& #define MAXLEN 20&&&&&&&&&&& //最大长度typedef char DATA;&&&&&&&&&&& //定义元素类型struct &CBTType&&&&&&&&&&&&&&&&&&&&&&&&&& /定义二叉树结点类型 {&DATA&&&&&//元素数据 &CBTType *&&&&&//左子树结点指针 &CBTType *&&&&//右子树结点指针 };/*********************初始化二叉树***********************/CBTType * InitTree(){&CBTType *&if(node = new CBTType)&&&&&&&&&&&&&&&&&& //申请内存 &{&&cout&&"请先输入一个根节点数据:"&&&&cin&&node-&&&node-&left=NULL;&&node-&right=NULL;&&if(node!=NULL)&&&&&&&&&&& //如果二叉树结点不为空 &&{&&&&&&&} else&&{&&&return NULL;&&}&}&return NULL;}/***********************查找结点*************************/CBTType *TreeFindNode(CBTType *treeNode,DATA data){&CBTType *&if(treeNode==NULL)&{&&return NULL;&}else&{&&if(treeNode-&data==data)&&{&&&return treeN&&}&&else&&&&&&&&//分别向左右子树查找&&&&&{&&&if(ptr=TreeFindNode(treeNode-&left,data))&&//左子树递归查找 &&&{&&&&&&&}&&&else if(ptr=TreeFindNode(treeNode-&right,data))&&&&&&&& //右子树递归查找 &&&{&&&&&&&}&&&else&&&{&&&&return NULL;&&&}&&}&} } /**********************添加结点*************************/void AddTreeNode(CBTType *treeNode){&CBTType *pnode,*&DATA&&if(pnode=new CBTType)&&&&&&&&&&&&& //分配内存 &{&&cout&&"输入二叉树结点数据:"&&&&cin&&pnode-&&&pnode-&left=NULL;&&&&&//设置左子树为空 &&pnode-&right=NULL;&&&&&//设置左子树为空 &&cout&&"输入该结点的父结点数据"&&&&cin&&&&parent=TreeFindNode(treeNode,data);&&&&&&&&&&&&&&&&&&&& //查找父结点,获得结点指针 &&if(!parent)&&{&&&cout&&"没有找到父结点"&&&&&&&&&&}&&cout&&"1.添加该结点到左子树;2.添加该结点到右子树。请输入操作对应的数字。"&&&&do&&{&&&cin&&&&&if(menusel=='1'||menusel=='2')&&&{&&&&switch(menusel)&&&&{&&&&&case '1':&&&&&//添加结点到左子树 &&&&&&if(parent-&left)&&&&&&&&&&&&&&&& //左子树不为空&&&&&&{&&&&&&&cout&&"左子树结点不为空"&& &&&&&&} &&&&&&else&&&&&&{&&&&&&&parent-&left=&&&&&&&cout&&"数据添加成功!"&&&&&&&&}&&&&&&&&&&&case '2':&&&&&//添加结点到右子树 &&&&&&if(parent-&right)&&&&&&&&&&&&&&&& //右子树不为空&&&&&&{&&&&&&&cout&&"右子树结点不为空"&&&&&&&&} &&&&&&else&&&&&&{&&&&&&&parent-&right=&&&&&&&cout&&"数据添加成功!"&& &&&&&&} &&&&&&&&&&&default:&&&&&&cout&&"子节点选择error!"&&&&&&&&&&&&} &&&}&&}while(menusel!='1'&&menusel!='2');&}} /***********************计算二叉树的深度********************************/int TreeDepth(CBTType *treeNode){&int depleft,&if(treeNode==NULL)&{&&return 0;&&&&&//结点为空的时候,深度为0 &}&else&{&&depleft=TreeDepth(treeNode-&left);&&//左子树深度(递归调用)&&depright=TreeDepth(treeNode-&right);&&&&&&& //右子树深度(递归调用)&&if(depleft)&&{&&&return ++&&}&&else &&{&&&return ++&&} &}} /*************************显示结点数据*********************************/void ShowNodeData(CBTType *treeNode){&cout&&treeNode-&data&&"\t";&&&&&//直接输出结点数据 } /***********************清空二叉树************************************/void ClearTree(CBTType *treeNode){&if(treeNode)&&&&&&&//判断当前树不为空 &{&&ClearTree(treeNode-&left);&&&&//清空左子树&&ClearTree(treeNode-&right);&&&&//清空右子树&&delete treeN&&&&&//释放当前结点所占用的内存&&}} /**************************按层遍历算法*********************************/void LevelTree(CBTType *treeNode){&CBTType *p;&CBTType *q[MAXLEN];&&&&&&//定义一个队列 &int head=0,tail=0;&if(treeNode)&&&&&&&//如果队首指针不为空&{&&tail=(tail+1)%MAXLEN;&&&&&//计算循环队列队尾序号&&q[tail]=treeN&&&&&//二叉树根指针进入队列 &&while(head!=tail)&&{&&&head=(head+1)%MAXLEN;&&&&//计算循环队列的队首序号&&&p=q[head];&&&&&//获取队首元素&&&ShowNodeData(p);&&&&//输出队首元素&&&if(p-&left!=NULL)&&&&//如果存在左子树&&&{&&&&tail=(tail+1)%MAXLEN;&&&//计算队列的队尾序号&&&&q[tail]=p-&&&&//左子树入队 &&&}&&&if(p-&right!=NULL)&&&&//如果存在右子树&&&{&&&&tail=(tail+1)%MAXLEN;&&&//计算队列的队尾序号&&&&q[tail]=p-&&&&//右子树入队 &&&} &&} &} } /*************************先序遍历算法**********************************/void DLRTree(CBTType *treeNode){&if(treeNode)&{&&ShowNodeData(treeNode);&&&&&//显示结点内容&&DLRTree(treeNode-&left);&&&&//显示左子树内容&&DLRTree(treeNode-&right);&&&&//显示右子树内容 &}} /***********************中序遍历算法************************************/void LDRTree(CBTType *treeNode){&if(treeNode)&{
&&LDRTree(treeNode-&left);&&&&//显示左子树内容&&&&&ShowNodeData(treeNode);&&&&&//显示结点内容&&DLRTree(treeNode-&right);&&&&//显示右子树内容 &&&&}&} /***********************后序遍历算法************************************/void LRDTree(CBTType *treeNode){&if(treeNode)&{&&LRDTree(treeNode-&left);&&&&//显示左子树内容&&&DLRTree(treeNode-&right);&&&&//显示右子树内容 &&&&&ShowNodeData(treeNode);&&&&&//显示结点内容&}&} /*************************主函数部分************************************/int main(){&CBTType *root=NULL;&&&&&&//root为指向二叉树根结点的指针&&//设置根结点&root=InitTree();&//添加结点&do&{&&cout&&"请选择菜单添加二叉树的结点:"&&&&cout&&"0.退出;1.添加二叉树的结点。"&&&&cin&&&&switch(menusel)&&{&&&case '1':&&&&AddTreeNode(root);&&&&&&&case '0':&&&&&&&default:&&&&cout&&"添加结点error"&&&&&&&&}&}while(menusel!='0'); &//输出树的深度 &cout&&"depth:"&&TreeDepth(root)&&&//输出结点内容&do&{&&cout&&"请选择菜单遍历二叉树,输入0表示退出:"&&&&cout&&"1.按层遍历"&&&&cout&&"2.先序遍历DLR"&&&&cout&&"3.中序遍历LDR"&&&&cout&&"4.后序遍历LRD"&&&&cin&&&&switch(menusel)&&{&&&case '0':&& &case '1':&& &&cout&&"按层遍历的结果:"&&&& &&LevelTree(root);&&&&&& cout&&&&&& &&&case '2':&&&&cout&&"先序遍历的结果:"&&&&&&DLRTree(root);&&&&cout&&&&&&&&&case '3':&&&&cout&&"中序遍历的结果:"&&&&&&LDRTree(root);&&&&cout&&&&&&&&&&case '4':&&&&cout&&"后序遍历的结果:"&&&&&&LRDTree(root);&&&&cout&&&&&&&&&default:&&&&cout&&"遍历方式选择出错!"&&&&&& &&}&}while(menusel!='0');&//清空二叉树& &ClearTree(root);&return 0;& } 对应的树形结构图如图:
程序运行界面:
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具||关于树的问题和解答
关于树的问题和解答
试题答案:解:(1)当定价为4元时,能实现每天800元的销售利润。(2)800元的销售利润
参考译文 孔子东游,见两小儿辩斗(1),问其故(2). 一儿曰:“我以(3)日始出时去(4
答:甲公司租入资产发生的装修、购置中央空调费用,按会计制度规定,属于经营租赁方式租入的固定
仪器仪表和自动化相关联的话是主要应用于过程自动化控制的。 主要原理是通过在现场的各种温度传
崩坏3萌新常见疑问解答,在崩坏3中,萌新玩家一定会有这样或者那样的疑问,因为在进入一款全
1.黑白图片:100÷(4+1)×4=80(张) 彩色图片:80÷16×5=25(张) 2
叶圣陶,原名叶绍钧,字秉臣,辛亥革命后改字圣陶。汉族人,江苏苏州人,现代著名作家、教育家、
从2001年起,鹏通公司在同行中间率先开展进口物流的探讨,成为进口代理行业的先锋及领导企业
大家知道,随着生活水平的提高,水污染情况日益严重,人们开始选购水家电来帮助实现水质的净化。
新闻很久之前就报道过,为什么沙县小吃比兰州拉面多,你知道兰州拉面为什么合面那么快吗而且不断
和面一定要控制好水量要一点一点的加水 不要让水把面冲开要不然 板子上就会流一大片让你措手不
呵呵 对于初学者来说学的东西应该是比较浅的 基本就是指法练习 其实课程多少不算什么 主要在
看看提示是什么路由器密码正确吗?
有可能是电磁阀坏了也叫脱水电机,在洗衣机底部,上面有写着脱水电机字样。如果是电脑板坏了,价
1、平静的湖面安详的轻轻的睡着。这一刻,除了班主任嘟嘟的脚步声教室里一片安静 2、(1)做
认数与计算 空间与图形 解决问题 代数初步 统计与概率 其他 一上册 20以内数的认识 分
你好:这个和以下部件有关系:1、轮胎异常磨耗;2、前轮定位不准确;3、转向机磨耗及间隙4、
卖家加入淘宝客推广有两种方法: 方法一:先在淘宝网登录自己的淘宝帐户--我是卖家(卖家中心
昨天下午盘古越狱团队发布了最新的iOS9.2-9.3.3的完美越狱,很多使用果机的小伙伴都
必应输入法是使用非常广泛的输入法,但在日常操作中也会有很多小问题出现。今天小编推出这个必应
这篇课文浅显易懂,六年级学生能理清课文条理、抓住课文主要内容,教学本篇课文重点是揣摩文章的
玩过手机RPG或者竞技类游戏的玩家都可以熟练操作。炫丽的技能配合RPG中的大量元素,让天龙
最新的钢铁炼新技术与工艺汇集,最全的钢铁冶炼新技术与工艺疑难问题解决方案,国内第一部以问答
青年人网公务员考试中心解答: 公务员面试考查专业方面的问题不多,一般来说是一两道专业方面的
其实,不管是什么样的面试形,问的问题都差不多,万变不离其宗,都有规律可寻。其实对所有的面试
饥荒是一款自由度相对较高的生存冒险游戏,玩家会在游戏中遭遇到各种生存挑战,保证自己能够活下
16.分期收款的外币收入如何折合人民币的问题 对于取得的收入为外国货币的,依照细则规定,以
男生:女生=1/3:1/2=2:3男生有:200/(2+3)*2=
百度外卖商户怎么入驻?百度外卖怎么开店?百度外卖是一个很火爆的软件,是上班族订外卖必备神器
交易猫怎么交易?交易猫是一款手机游戏交易平台,不收取任何第三方费用。玩家可以交易游戏币,道
1234567891011121314151617181920

我要回帖

更多关于 数据结构求解迷宫问题 的文章

 

随机推荐