天勤数据结构笔记——第六章 树与二叉树(大题)
1、基础题
(1)略
(2)采用层次遍历,visit(q); 改为 count++;
void level(BTNode *p,int &count){count=0;int front=rear=0;BTNode *que[maxSize];BTNode *q;if(p!=NULL){//根结点入队rear=(rear+1)%maxSize;que[rear]=p;while(front!=rear){//结点出队front=(front+1)%maxSize;q=que[front];count++;if(q->lchild!=NULL){//左孩子入队rear=(rear+1)%maxSize;que[rear]=q->lchild;}if(q->rchild!=NULL){//右孩子入队rear=(rear+1)%maxSize;que[rear]=q->rchild;}}}
}
(3)visit(q);改为判断其是否是叶子结点,再count++
void level(BTNode *p,int &count){count=0;int front=rear=0;BTNode *que[maxSize];BTNode *q;if(p!=NULL){//根结点入队rear=(rear+1)%maxSize;que[rear]=p;while(front!=rear){//结点出队front=(front+1)%maxSize;q=que[front];if(q->lchild==NULL&&q->rchild==NULL)count++;if(q->lchild!=NULL){//左孩子入队rear=(rear+1)%maxSize;que[rear]=q->lchild;}if(q->rchild!=NULL){//右孩子入队rear=(rear+1)%maxSize;que[rear]=q->rchild;}}}
}
(4)需要确定两件是:判断出叶子结点,要按从左往右的顺序。由于三种遍历中叶子结点的序列不变。这里就选先序遍历。
void preorder(BTNode *p,BTNode *head,BTNode *tail){if(p!=NULL){BTNode *stack[maxSize];BTNode *q,*r;int top=-1,first=0;stack[++top]=p;while(top!=-1){q=stack[top--];if(q->rchild==NULL&&q->lchild==NULL){if(!first){head=q;tail=q;r=q;first=1;}else{r->rchild=q;r=q;tail=q;}}if(q->rchild)stack[++top]=q->rchild;if(q->lchild)stack[++top]=q->lchild;}}
}
(5)遍历的时候给parent指针赋值
void fuzhi(BTNode *p){if(p!=NULL){BTNode *stack[maxSize],*q;int top=-1;stack[++top]=p;p->parent=NULL;while(top!=-1){q=stack[top--];if(q->rchild!=NULL){q->rchild->parent=p;stack[++top]=q->rchild;}if(q->lchild!=NULL){q->lchild->parent=p;stack[++top]=q->lchild;}if(q->rchild==NULL&&q->lchild==NULL){//叶结点BTNode *r=q;while(r!=NULL){print(r->data);r=r->parent;}}}}
}
(6)由于是满二叉树的先序遍历,故去掉根节点(第一个结点)剩下偶数个结点,前半部分是左子树的序列,后半部分是右子树的序列。只需将根结点移到最后,然后递归地处理左右子树部分。
//pre是序列数组,pos是转变后的数组
void change(char pre[],int L1,int R1,char pos[],int L2,int R2){if(L1<=R1){pos[R2]=pre[L1];change(pre,L1+1,(L1+1+R1)/2,pos,L2,(L2+R2-1)/2);change(pre,(L1+3+R1)/2,R1,pos,(L2+R2+1)/2,R2-1);}
}
(7)可以在存储结构中添加一个层号信息。但此处用标准答案的先序遍历的递归算法
int L=1;
void leno(BTNode *p,char x){if(p!=NULL){if(p->data==x)cout<<L<<endl;L++;leno(p->lchild,x);leno(p->rchild,x);L--;}
}
(8)略
(9)入栈序列相当于先序遍历顺序,出栈序列相当于中序遍历顺序。先序和中序能唯一确定二叉树。
(10)在先序遍历的递归算法上改动一下
void doubleorder(BTNode *p){if(p!=NULL){visit(p);doubleorder(p->lchild);visit(p);doubleorder(p->rchild);}
}
(11)设中序线索二叉树的类型为TBTNode InThTree
1)t 结点的子树上中序遍历的最后一个结点,就是 t 结点下最右边的结点。另一个说法:只要结点下面有右子树就遍历下去,直到右子树为空。
TBTNode* inLast(TBTNode *t){TBTNode *p=t;while(p && p->rtag==0){p=p->rchild;}return p;
}
2)t子树中序下的前驱,若t有左线索,则该左线索就是前驱;若t无左线索,则其左子树中中序的最后一个结点即为它的中序前驱。
TBTNode* inPrior(TBTNode *t){TBTNode *p=t->lchild;//p要么是左子树,要么是左线索if(p && !t->ltag){//p是左子树的情况下,找出最右结点p=inLast(p);}return p;
}
2、思考题
(1)这题除了设parent指针外,还可以用栈。每遍历到一个结点就入栈,遍历到根结点后打印栈。然后退回上一层的时候,需要退回栈顶指针一步。
int i;
int top=-1;
char pathsetback[maxSize];
void allPath(BTNode *p){if(p!=NULL){pathsetback[++top]=p->data;if(p->lchild==NULL && p->rchild==NULL){for(i=0;i<top;i++){cout<<pathsetback[i];}}allPath(p->lchild);allPath(p->rchild);--top;}
}
(2)略
天勤数据结构笔记——第六章 树与二叉树(大题)相关推荐
- 天勤数据结构笔记——第六章 树与二叉树(代码)
二叉树的链式存储结构 typedef struct BTNode{char data;struct BTNode *lchild;struct BTNode *rchild; }BTNode; 先序遍 ...
- 考研数据结构笔记——第五章 树和二叉树
文章目录: 一:二叉树 1.性质 2.二叉树的存储结构 2.1 二叉树顺序存储 2.2 二叉树链式存储
- 数据结构思维 第六章 树的遍历
第六章 树的遍历 原文:Chapter 6 Tree traversal 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 本章将介绍一个 Web 搜索引擎,我们将在本书其余部分开 ...
- 《大话数据结构》第六章 树
文章目录 第六章 树 树的定义 结点的分类 树的抽象数据类型 树的存储结构 双亲表示法 孩子表示法 孩子兄弟表示法 二叉树 特殊二叉树 斜树 满二叉树 完全二叉树 二叉树的性质 二叉树的存储结构 遍历 ...
- 408数据结构考研笔记——第五章树与二叉树(重点)
目录 一.基本概念 1.定义 2.基本术语 3.性质(重点!!) 二.二叉树 1.定义 2.特殊二叉树 1.满二叉树 2.完全二叉树 3.二叉排序树 4.平衡二叉树 3.性质 4.存储结构 1.顺序存 ...
- 数据结构笔记 第六章 查找技术
查找技术 在计算机科学中定义为:在一些(有序的/无序的)数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找.也就是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录或数据元 ...
- 2022天勤考研数据结构笔记 第3章 栈和队列
2022天勤考研数据结构笔记 第3章 栈和队列(更新中) 第3章 栈和队列 3.1 结构体定义 3.2 顺序栈 3.3 链栈 3.4 栈的应用 3.5 顺序队 3.6 链队 第3章 栈和队列 栈和队列 ...
- 2022天勤考研数据结构笔记 第2章 线性表
2022天勤考研数据结构笔记 第2章 线性表(更新中) 第2章 线性表 2.1 结构体定义 2.2 顺序表 2.3 单链表 2.4 双链表 2.5 循环链表 2.6 逆置问题(408重要考点) 第2章 ...
- 深入理解 C 指针阅读笔记 -- 第六章
Chapter6.h #ifndef __CHAPTER_6_ #define __CHAPTER_6_/*<深入理解C指针>学习笔记 -- 第六章*/typedef struct __p ...
最新文章
- 如何在Ubuntu上使用ssh-add永久添加私钥? [关闭]
- PT60报错(在表 $ 中午关键字$的输入项目T555Z)
- android动态添加标签,android – 动态添加Textview
- Mybatis笔记一:java.lang.NoClassDefFoundError: org/apache/ibatis/mapping/DatabaseIdProvider
- 渗透测试小马(一句话)篇
- 【微信小程序】目前最全的《Java面试题及解析》
- linux中修改字符编码
- 超过4G的分区安装oracle,Red hat Linux AS4.0安装Oracle9.2.04详细步骤
- Yii GridView
- python爬虫微信_python 微信爬虫
- win11 打开 IE7 兼容模式
- 2021高考数学成绩查询,2021八省联考成绩相继公布!数学平均60多分,八个省市本科录取率曝光...
- 常微分方程 $6 一阶微分方程解的存在唯一性
- 梦幻西游转区后没显示原服务器,梦幻西游:你不知道的转区小细节,刷区时间不只是周二上午的10点...
- 录音转文字软件哪个好?推荐这三款软件给你
- LCD(GEC6818)
- 大数据就业:学完大数据怎样就业
- 保持应用后台,熄屏状态下继续运行
- 对ROS局部运动规划器Teb的理解
- 关于中国地图审图号的说明
热门文章
- 山东省2022 年专升本 计算机大纲(演示文稿软件)
- 2023升级运营版uniapp多商户商城小程序+H5+APP+商家入驻短视频社区种草直播阶梯拼团源码
- 2020江苏省小学生计算机比赛,2020年“领航杯”江苏省中小学电脑制作活动暨首届人工智能大赛在苏州开幕...
- 人人皆可虚拟,直播还能这么玩?声网推出 MetaLive 元直播解决方案
- 中国医院CRM客户关系管理系统的构建分析
- timthumb.php下载,WordPress使用timthumb.php截取文章缩略图教程
- 微信公众号正确使用开放标签wx-open-launch-weapp
- 校园O2O商铺平台-店铺注册Service层和Controller层
- 纯 Html5+Css 实现漂亮的侧边导航
- 云服务器型号是什么,云服务器型号查看