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)略

天勤数据结构笔记——第六章 树与二叉树(大题)相关推荐

  1. 天勤数据结构笔记——第六章 树与二叉树(代码)

    二叉树的链式存储结构 typedef struct BTNode{char data;struct BTNode *lchild;struct BTNode *rchild; }BTNode; 先序遍 ...

  2. 考研数据结构笔记——第五章 树和二叉树

    文章目录: 一:二叉树 1.性质 2.二叉树的存储结构 2.1 二叉树顺序存储 2.2 二叉树链式存储

  3. 数据结构思维 第六章 树的遍历

    第六章 树的遍历 原文:Chapter 6 Tree traversal 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 本章将介绍一个 Web 搜索引擎,我们将在本书其余部分开 ...

  4. 《大话数据结构》第六章 树

    文章目录 第六章 树 树的定义 结点的分类 树的抽象数据类型 树的存储结构 双亲表示法 孩子表示法 孩子兄弟表示法 二叉树 特殊二叉树 斜树 满二叉树 完全二叉树 二叉树的性质 二叉树的存储结构 遍历 ...

  5. 408数据结构考研笔记——第五章树与二叉树(重点)

    目录 一.基本概念 1.定义 2.基本术语 3.性质(重点!!) 二.二叉树 1.定义 2.特殊二叉树 1.满二叉树 2.完全二叉树 3.二叉排序树 4.平衡二叉树 3.性质 4.存储结构 1.顺序存 ...

  6. 数据结构笔记 第六章 查找技术

    查找技术 在计算机科学中定义为:在一些(有序的/无序的)数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找.也就是根据给定的某个值,在查找表中确定一个关键字等于给定值的记录或数据元 ...

  7. 2022天勤考研数据结构笔记 第3章 栈和队列

    2022天勤考研数据结构笔记 第3章 栈和队列(更新中) 第3章 栈和队列 3.1 结构体定义 3.2 顺序栈 3.3 链栈 3.4 栈的应用 3.5 顺序队 3.6 链队 第3章 栈和队列 栈和队列 ...

  8. 2022天勤考研数据结构笔记 第2章 线性表

    2022天勤考研数据结构笔记 第2章 线性表(更新中) 第2章 线性表 2.1 结构体定义 2.2 顺序表 2.3 单链表 2.4 双链表 2.5 循环链表 2.6 逆置问题(408重要考点) 第2章 ...

  9. 深入理解 C 指针阅读笔记 -- 第六章

    Chapter6.h #ifndef __CHAPTER_6_ #define __CHAPTER_6_/*<深入理解C指针>学习笔记 -- 第六章*/typedef struct __p ...

最新文章

  1. 如何在Ubuntu上使用ssh-add永久添加私钥? [关闭]
  2. PT60报错(在表 $ 中午关键字$的输入项目T555Z)
  3. android动态添加标签,android – 动态添加Textview
  4. Mybatis笔记一:java.lang.NoClassDefFoundError: org/apache/ibatis/mapping/DatabaseIdProvider
  5. 渗透测试小马(一句话)篇
  6. 【微信小程序】目前最全的《Java面试题及解析》
  7. linux中修改字符编码
  8. 超过4G的分区安装oracle,Red hat Linux AS4.0安装Oracle9.2.04详细步骤
  9. Yii GridView
  10. python爬虫微信_python 微信爬虫
  11. win11 打开 IE7 兼容模式
  12. 2021高考数学成绩查询,2021八省联考成绩相继公布!数学平均60多分,八个省市本科录取率曝光...
  13. 常微分方程 $6 一阶微分方程解的存在唯一性
  14. 梦幻西游转区后没显示原服务器,梦幻西游:你不知道的转区小细节,刷区时间不只是周二上午的10点...
  15. 录音转文字软件哪个好?推荐这三款软件给你
  16. LCD(GEC6818)
  17. 大数据就业:学完大数据怎样就业
  18. 保持应用后台,熄屏状态下继续运行
  19. 对ROS局部运动规划器Teb的理解
  20. 关于中国地图审图号的说明

热门文章

  1. 山东省2022 年专升本 计算机大纲(演示文稿软件)
  2. 2023升级运营版uniapp多商户商城小程序+H5+APP+商家入驻短视频社区种草直播阶梯拼团源码
  3. 2020江苏省小学生计算机比赛,2020年“领航杯”江苏省中小学电脑制作活动暨首届人工智能大赛在苏州开幕...
  4. 人人皆可虚拟,直播还能这么玩?声网推出 MetaLive 元直播解决方案
  5. 中国医院CRM客户关系管理系统的构建分析
  6. timthumb.php下载,WordPress使用timthumb.php截取文章缩略图教程
  7. 微信公众号正确使用开放标签wx-open-launch-weapp
  8. 校园O2O商铺平台-店铺注册Service层和Controller层
  9. 纯 Html5+Css 实现漂亮的侧边导航
  10. 云服务器型号是什么,云服务器型号查看