天勤数据结构笔记——第六章 树与二叉树(大题)
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 ...
最新文章
- 8位图像的双边滤波器实现
- centos下pg_dump的服务器版本不匹配问题
- linux按函数数字大小排序,linux awk 数组排序多种实现方法
- 深入了解MyBatis返回值
- for命令不跳过空白行_饭店火夫说漏嘴:炒鸡肉时,很多人跳过这一步,难怪鸡肉不好吃...
- 怎么用python实现回归_Python使用sklearn实现的各种回归算法示例
- 如何简单的测试kubernetes的dns add-ons是否工作正常?
- vue笔记(一)基本使用、数据检测
- 【CodeForces - 527C】Glass Carving(线段树或者SBT或者set)
- 《C和指针》——将无符号整数转换为字符
- 代码中log一直报错
- the JAR file spring-beans-4.0.0.RELEASE.jar has no source attachment
- (MSSQL)sp_refreshview刷新视图失败及更新Table字段失败的问题解决
- Centos6.5 安装配置 Apache +mysql +php 操作文档
- 第二章 OpenHarmony工程介绍
- python(turtle库)画七巧板
- 计算机图形学---纹理及纹理隐射
- composer.lock(锁文件)到底要不要提交到项目的版本库中?
- 推荐书籍:网络流量整形与带宽控制技术
- delphi异步与javascript
热门文章
- 【制作多媒体演示文稿软件】Focusky教程 | 设置文本背景
- 南方科技大学 matlab,姚新 | 南方科技大学
- 近红外干货 | NIRS_SPM单被试激活分析过程
- 软件工程笔记(十一)
- fbx转3dtiles
- 画正方形圆角android,Android 快速绘制一个圆角矩形的实例
- iMeta | 华南师大王璋组综述人体肺部微生物组与人类健康和疾病之间的隐秘关联...
- 动态分页展示效果(纯JavaScript编写,值得学习)
- csss实现三角形(倒三角、左右侧边倒三角等)
- 免疫磁珠法分离细胞原理/MACS微珠(MicroBeads/MACS分选柱(Separation Column)