二叉树线索化仍不能解决的两个问题及原因
线索二叉树 结点结构定义如下:
若结点有左子树,则LChild域仍指向其左孩子;
否则,LChild域指向其某种遍历序列中的直接前驱结点。
若结点有右子树,则RChild域仍指向其右孩子;
否则,RChild域指向其某种遍历序列中的直接后继结点。
Ltag
0: LChild域指示结点的左孩子
1: LChild域指示结点的遍历前驱
Rtag
0: RChild域指示结点的右孩子
1: RChild域指示结点的遍历后继
线索二叉树的结点结构:
线索二叉树
二叉树的中序线索化
void Inthread(BiTree root)
{ if(root!=NULL){Inthread(root->LChild);/*线索化左子树*/if(root->LChild == NULL){root->LChild = pre;root->Ltag = 1; /*置前驱线索*/}if(pre != NULL && pre->RChild == NULL){pre->RChild = root;pre->Rtag = 1; /*置后继线索*/}pre = root; /*记录当前访问结点,将成为下一个访问节点的前驱*/Inthread(root->LChild);/*线索化右子树*/}
}
先序、后序线索化也类似。(中序用的较多)
在线索二叉树中查找前驱和后继结点
eg 二叉树在线索化后,仍不能有效求解的问题是(D)
A先序线索二叉树中求先序后继
B中序线索二叉树中求中序后继
C中序线索二叉树中求中序前驱
D后序线索二叉树中求后序后继
先序遍历(中左右)、中序遍历(左中右)的最后访问的节点都是左或右叶节点,叶节点是没有子树的,所以两个指针域空出来了,可以存放线索指针。但是后续遍历(左右中),最后访问的是子树的根节点,而子树根节点的两个指针域都指向子树了,所以不能空出来存放线索信息。
线索二叉树有三种类型,分别为先序、中序、后序。
利用建立的线索二叉树找某个节点的前驱或者后继,仍不能有效解决先序线索二叉树找先序前驱和后序线索二叉树找后序后继。
先序遍历:A->B->D->E->C->F->G
中序遍历:D->B->E->A->F->C->G
后序遍历:D->E->B->F->G->C->A
A选项:
A->B->D这串可以从子指针得到
D->E->C由于子指针是空的,可以从子指针生成线索
C->F->G由上可得
B选项:同A,可以从空指针和子指针生成线索
C选项:同A
D选项:
C->A是不可能达到,因为C的左右儿子都是满的,已经没有地方存线索,所以不可能线索化
每个节点中存着自己的值,左孩子或者直接前驱和右孩子或者直接后继,我们从每个节点只能向下查找来找直接前驱或者直接后继,时间复杂度为O(n)。
若去遍历该节点的祖先节点,也可以找到先序的直接前驱和后序的直接后继,但是不建立线索二叉树通过遍历也可以找到它的直接前驱和直接后继,这两种情况就不用用线索二叉树去考虑了。所以线索二叉树不能有效解决先序线索二叉树找先序前驱和后序线索二叉树找后序后继。
**
4种可行情况代码
**
/*先序线索二叉树找后继*/
BiThrTree PreNext(BiThrThee p)
{if(p->Rtag == 1)next = p->RChild;else if(p->LChild){next = p->LChild;}else{next = p->RChild;}return next;
}
/*中序线索二叉树找前驱*/
BiThrTree InPre(BiThrThee p)
{if(p->Ltag == 1)pre = p->LChild;else{for(q=p->LChild;q->Rtag==0;q=q->RChild)pre = q;}return pre;
}
/*中序线索二叉树找后继*/
BiThrTree InNext(BiThrThee p)
{if(p->Rtag == 1)next = p->RChild;else{for(q=p->RChild;q->Ltag==0;q=q->LChild)next = q;}return next;
}
/*后序线索二叉树找前驱*/
BiThrTree PostPre(BiThrThee p)
{if(p->Ltag == 1)pre = p->LChild;else if(p->RChild){pre = p->RChild;}else{pre = p->LChild;}return pre;
}
二叉树线索化仍不能解决的两个问题及原因相关推荐
- 二叉树线索化示意图_二叉树的线索化算法思想详解
二叉树的线索化,这几天以来我很难掌握,今天终于想通了,哈哈,首先我们来看看二叉树线索化之后会变成什么样子,这里我们以图中的二叉树为例,图如下: 画的太糙,各位看官讲究着看吧- -.所谓二叉树的线索化, ...
- 数据结构二叉树线索化
线索化二叉树指的是将二叉树中的结点进行逻辑意义上的"重排列",使其可以线性的方式访问每一个结点.二叉树线索化之后每个结点都有一个线性下标,通过这个下标可以快速访问结点,而不需要 ...
- 二叉树线索化(C语言)
二叉树线索化 前言: 二叉树线索化主要是将二叉树按遍历的顺序存放于链表中,生成一个特定顺序的链表,访问该链表相当于遍历二叉树,此操作可便于在遍历的每一次操作中,可获取当前结点前驱或后继结点的数据信息 ...
- C语言实现二叉树线索化
#include <stdio.h> #include <stdlib.h>/** * 线索二叉树,实质是遍历一次二叉树 */typedef struct ThreadNode ...
- 数据结构—二叉树线索化(线索化的先序、中序、后序遍历)
1.线索二叉树基本概念 二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历.用二叉树作为存储结构时,取到一个节点,只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序 ...
- 线索二叉树(线索链表遍历,二叉树线索化)
一,基本概念 线索二叉树,即在二叉链表的基础上,将二叉链表的空指针域指向其前驱节点和后继节点 线索:将二叉链表中的空指针域指向前驱结点和后继结点的指针被称为线索 线索化:使二叉链表中结点的空链域存放其 ...
- 二叉树线索化示意图_二叉树的线索化
二叉树是一种非线性结构,遍历二叉树几乎都是通过递归或者用栈辅助实现非递归的遍历.二叉树作为存储结构时,一个节点只能获取节点的左孩子和右孩子,不能直接得到节点的任一遍历序列的前驱或者后继.为了保存这种在 ...
- 二叉树线索化-调通-简单
#include<stdio.h> #include<malloc.h> #include<stdlib.h> //二叉树链式存储 typedef char Dat ...
- 二叉树线索化示意图_103-线索化二叉树思路图解
2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...
最新文章
- 对par.markdown解析进行完善
- 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取注入的 libbridge.so 动态库中的 load 函数地址 并 通过 远程调用 执行该函数 )
- linux unset path,linux查看和修改PATH环境变量的方法
- sync.Map低层工作原理详解
- 国外数学奇才称:“平行线可相交”,到死未被认可,12年后被证实
- aee快递查询 在php_第48课 thinkphp5添加商品库
- 批量修改同一目录下文件名--操作so easy
- 如何在EDUIS中导出ETL字幕模板_给视频加字幕?这8个工具助力你的短视频创作!...
- body-parser 是一个Http请求体解析中间件
- 在嵌入式设计中使用MicroBlaze(Vivado版本)
- 堆插入和删除的简单实现
- 过滤器 拦截器 controller 页面 的执行顺序
- 防止他人复制网站内容
- WPF 邮箱输入框提示 和 手机号码验证 .
- turn.js教程及总结
- Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector论文解读
- cocos Creator i18n 多语言
- sata和sas硬盘Linux,SAS硬盘与SATA硬盘的功能对比
- 云计算的发展趋势(一)云计算相关领域介绍
- 【光学】基于Matlab实现二维光子晶体的能带图和场
热门文章
- pool win10提示bad_Win10怎么修复出现bad pool header蓝屏的情况?
- 大学毕业生必听十条人生忠告
- Java 面试全解析:核心知识点与典型面试题
- 献结程序员的一个故事——管道的故事
- 人脸识别9-人脸搜索(概述)
- Chromium源码—base基础库说明
- Qt官方示例:UI Components: Scroll Bar Example(自定义滚动条)
- 怡丰机器人上市_成立三年之内 机器人领域的这些黑马公司不可不知
- OpenERP开发文档 2.1.模块开发
- 学计算机的男生生好不好找女朋友,我是计算机的大2学生,我们班上女生极少,我很想找女朋友,请问怎么? 爱问知识人...