中序线索树和后序线索树
约定
Node* | Bool | Data | Bool | Node* |
---|---|---|---|---|
lchild | LTag | data | RTag | rchild |
LTag=0 时lchild指向左儿子;
LTag=1 时lchild指向前驱;
RTag=0 时rchild指向右儿子;
RTag=1 时rchild指向后继。
中序线索树
1.中序线索树的建立分两步
首先建立二叉树时初始化 lchild、LTag 、RTag、rchild,然后中序遍历二叉树,记录每一个结点的前驱和后继,找前驱和后继的方法:
①找当前结点的后继
若 RTag=1 右链域为后继;
若 RTag=0 遍历右链域指向的右子树时范围跟的第一个结点(右子树最左下的结点)
②找当前结点的前驱
若 LTag=1 左链域是前驱;
若 LTag=0 遍历左链域指向的左子树时访问的最后一个结点(左子树最右下的结点)
2.找前驱和后继的原理
中序遍历的伪代码:
function TaskHandler(Node)--对节点的处理
endfunction MidOrderTraverse(currRootNode)if currRootNode ~= nil thenMidOrderTraverse(currRootNode.lchild)TaskHandler(currRootNode)MidOrderTraverse(currRootNode.rchild)end
endMidOrderTraverse(BiTreeRootNode)
从代码执行顺序的角度:
对于某一次函数的执行,遍历到 currRootNode
的前驱和后继都是基于 currRootNode
的,并且由于:
① MidOrderTraverse(currRootNode.lchild)
返回之后才会执行TaskHandler(currRootNode)
② 执行 TaskHandler(currRootNode)
之后立即执行 MidOrderTraverse(currRootNode.rchild)
所以:
①比某一次执行 TaskHandler(currRootNode)
更先的一次执行就是 MidOrderTraverse(currRootNode.lchild)
之中的最后一次 TaskHandler(currRootNode)
②比某一次执行 TaskHandler(currRootNode)
更晚的一次执行就是 MidOrderTraverse(currRootNode.lchild)
之中的第一次 TaskHandler(currRootNode)
从遍历的意义上转述:
对于某一个结点,它的前驱和后继都在它的左右子树上,并且由于:
①遍历完某一个结点的左子树才访问这个结点
②访问了这个结点之后立即开始遍历这个结点的右子树
所以:
①比访问某一次结点更先的一次访问就是这个结点的左子树中的最后一次访问
②比访问某一次结点更晚的一次访问就是这个结点的右子树中的第一次访问
又因为:
中序遍历的访问顺序是先左下、再中、后右下
所以:
①对某一子树的最后一次访问的结点是这个子树的最右下的结点
②对某一子树的第一次访问的结点是这个子树的最左下的结点
所以:
①比访问某一次结点更先的一次访问的结点就是这个结点的左子树中的最右下的结点
②比访问某一次结点更晚的一次访问的结点就是这个结点的右子树中的最左下的结点
转述成前驱和后继的说法:
①某一结点的前驱就是这个结点的左子树中的最右下的结点
②某一结点的后继就是这个结点的右子树中的最左下的结点
后序线索树
1.后继结点
若结点为根,则无后继;
若结点为其双亲的右孩子,则其后继为其双亲;
若结点为其双亲的左孩子,且双亲无右子女,则其后继为其双亲;
若结点为其双亲的左孩子,且双亲有右子女,则结点的后继是其双亲的右子树中按后序遍历的第一个结点。
唉……需要知道双亲才行,好麻烦,不想研究了,就这样把
中序线索树和后序线索树相关推荐
- 数据结构 | 第十一章:二叉树和其他树 | 【前序遍历】【中序遍历】【后序遍历】【层次遍历】 | 并查集
第5-10章:线性结构,元素之间存在线性次序(线性表.数组与矩阵.栈.队列.跳表和散列表 第11-15章:层次结构(二叉树和树.优先队列.竞赛树.搜索树) 文章目录 11.1 树 11.2 二叉树 1 ...
- 树的遍历(中序,前序,后序)
与只有一种逻辑遍历它们的线性数据结构(数组.链表.队列.堆栈等)不同,树可以以不同的方式遍历,常见的有中序遍历,前序遍历和后序遍历. 实现各种遍历的方法又包括: 以上图为例: 深度优先遍历: (a) ...
- 程序员面试题精选100题(06)-二元查找树的后序遍历结果[数据结构]
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回true,否则返回false. 例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果: 8 ...
- 6.二元查找树的后序遍历结果[PostOrderOfBST]
[题目] 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回true,否则返回false. 例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果: 8 ...
- 9判断整数序列是不是二元查找树的后序遍历结果
转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4252095.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己 ...
- XDOJ 363 输出快速排序递归算法隐含递归树的后序遍历序列 AC
像我这样的菜鸡也没有什么能输出的,好像我写题解也不算输出. 最近期末了,写数据结构实验的时候,这个题写了挺久的,搞出来记录一下. 输出快速排序递归算法隐含递归树的后序遍历序列 描述: 快速排序递归算法 ...
- Java版二叉树的前序遍历查找、中序遍历查找和后序遍历查找
文章收藏的好句子:任何挫折,如果无法彻底击败你,那一定会使你更强. 目录 1.二叉树的节点查找 1.1 前序遍历查找 1.2 中序遍历查找 1.3 后序遍历查找 1.二叉树的节点查找 1.1 前序遍 ...
- leetCode 1110 删点成林(树,后序遍历)
题目链接:点击查看 题目描述: 给定一个整数二叉树和一些整数,求删掉这些整数对应的节点后,剩余的子树. 输入输出: 输入:root = [1,2,3,4,5,6,7], to_delete = [3, ...
- 后序遍历c语言程序,C++对树进行后序遍历的代码
下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. #include #include struct Node{ Node *lchild;/ ...
- LeetCode根据前序与中序、中序与后序,前序与后序遍历序列构建二叉树
根据前序与中序遍历序列构建二叉树 LeetCode题目来源 1.1 题目描述 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是 ...
最新文章
- AOP具体的实现写法
- idea创建包怎么让包分层_干货 | 通勤包怎么选?我推荐这6只
- 6.22软件工程总结
- 【CASS精品教程】CASS 9.2 for AutoCAD2014启动提示文件加载,怎么处理?
- 为什么你写的拦截器中不能注入Java bean?
- python2还能用吗_官方推荐python3,为何还有人在用python2呢?
- Enterprise Library 4.1学习笔记3----安全应用程序块
- Ubuntu 18.04LTS系统设置窗口打不开或者消失解决办法
- Java EE 6 最终草案暗示了平台的未来发展方向
- 51单片机c语言延时一秒,单片机C语言的延时
- 自媒体原创度检测工具有哪些?这几个可以免费用
- PS如何去除图片中文字
- 2018 蓝桥杯 C++ A组 1-7
- 警告: A docBase D:\apache-tomcat-8.5.12\webapps\webapps\projectname inside the host appBase has been
- 【数理知识】Lipschitz 条件 Lipschitz 常数
- 蓝湖怎么切图标注_如何用蓝湖做自动标注 ?
- 云服务器搭建nacos服务
- 红米k30s至尊纪念版参数配置
- Springcloud使用全局捕获异常管理接口异常
- 达梦数据库LENGTH_IN_CHAR(对象的长度是否以字符为单位)总结
热门文章
- MySQL基础篇(04):存储过程和视图,用法和特性详解
- SpringCloud微服务(05):Zuul组件,实现路由网关控制
- 【Matlab】private文件夹
- RedHat系列软件管理(第二版) --源码包安装
- 对象序列化机制的理解
- Cannot obtain the required interface (IID_IDBCreateCommand) from OLE DB provider OraOLEDB.Oracle...
- CXF WebService 开发文档-目录索引
- Java中使用OpenSSL生成的RSA公私钥进行数据加解密
- TV Battle --HOJ 11915
- 什么是计算机考试题,计算机考试word什么版本 计算机word考试试题