笔试算法题(41):线索二叉树(Threaded Binary Tree)
议题:线索二叉树(Threaded Binary Tree)
分析:
为除第一个节点外的每个节点添加一个指向其前驱节点的指针,为除最后一个节点外的每个节点添加一个指向其后续节点的指针,通过这些额外的指针可以某种遍历方式对二叉树进行遍历,而加了这些额外指针的二叉树就是线索二叉树;
对于含有N个节点的二叉树而言,一共有2N个指针,但除了根节点的其他节点都有来自其父节点的指针,所以耗用了N-1个指针,则最终剩下2N-(N- 1)=N+1个空指针;线索二叉树就是利用这些空指针存储具有某种遍历顺序的前驱和后续,就遍历顺序而言线索二叉树分为:前序,中序和后序三种线索二叉 树;
将一棵二叉树进行线索化就是为其空指针赋值的过程,所以需要对二叉树进行对应的遍历(如构建前序线索二叉树,就需要对二叉树进行前序遍历);如下例子是将一棵二叉树线索化为一棵中序线索二叉树,

- 构建线索二叉树的时间复杂度为O(N),其可以在O(1)或者O(logN)的时间复杂度内找到指定节点在某种遍历下的前驱和后续,但是其维护成本较高,但插入或者删除节点的时候,需要花费额外的时间维护线索指针的正确性;
样例:
struct ThreadedNode {
int value;
int Lthread;
int Rthread;
ThreadedNode *left;
ThreadedNode *right;
};
/**
* 这里仅实现了中序线索化,前序跟后序线索化的实现只是处理节点的顺序
* 更改
* */
void InOrderThreaded(ThreadedNode *cur, ThreadedNode *pre) {
if(cur==NULL)
return;
else {
/**
* 中序遍历:首先处理左子树,然后当前节点,最后右子树
* */
InOrderThreaded(cur->left, pre);
/**
* 首先对当前节点的Lthread和Rthread标志进行初始化
* */
if(cur->left==NULL)
cur->Lthread=;
else
cur->Lthread=;
if(cur->right==NULL)
cur->Rthread=;
else
cur->Rthread=;
/**
* 一开始pre需要设置为NULL,但是也可以创建一个head节点,这样就
* 不用每次都进行pre!=NULL的判断
* */
if(pre!=NULL) {
/**
* 完成前一个节点的后续线索化
* */
if(pre->Rthread==)
pre->right=cur;
/**
* 完成当前节点的前驱线索化
* */
if(cur->Lthread==)
cur->left=pre;
}
pre=cur;
InOrderThreaded(cur->right, pre);
}
}
/**
* 查找给定节点target在线索二叉树root的中序遍历中的后续节点successor
* 分两种情况:
* 1. 如果target的右子树非空,则其后续节点是中序遍历右子树的第一个节点,O(logN)
* 2. 如果target的右子树为空,则其后续节点直接就是target->right指向的节点,利用线索化优势,O(1)
* */
ThreadedNode* FindSuccessor(ThreadedNode *target) {
/**
* 利用线索化标记进行判断
* */
if(target->Rthread==)
return target->right;
else {
ThreadedNode *temp=target->right;
/**
* 利用线索化标记进行判断
* */
while(temp->Lthread==)
temp=temp->left;
return temp;
}
}
/**
* 查找给定节点target在线索二叉树root的中序遍历中的前驱节点precursor
* 分两种情况:
* 1. 如果target的左子树非空,则其前驱节点是中序遍历左子树的最后一个节点,O(logN)
* 2. 如果target的左子树为空,则其前驱节点就直接是target->left指向的节点,利用线索化优势,O(1)
* */
ThreadedNode* FindPrecursor(ThreadedNode *target) {
if(target->Lthread==)
return target->left;
else {
ThreadedNode *temp=target->left;
while(temp->Rthread==)
temp=temp->right;
return temp;
}
}
参考连接:
http://student.zjzk.cn/course_ware/data_structure/web/main.htm
笔试算法题(41):线索二叉树(Threaded Binary Tree)的更多相关文章
- 遍历二叉树 traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化
遍历二叉树 traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化 1. 二叉树3个基本单元组成:根节点.左子树.右子树 以L.D.R ...
- 线索二叉树Threaded binary tree
摘要 按照某种遍历方式对二叉树进行遍历,可以把二叉树中所有结点排序为一个线性序列.在该序列中,除第一个结点外每个结点有且仅有一个直接前驱结点:除最后一个结点外每一个结点有且仅有一个直接后继结点.这 ...
- LeetCode算法题-Average of Levels in Binary Tree(Java实现)
这是悦乐书的第277次更新,第293篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第145题(顺位题号是637).给定一个非空二叉树,以数组的形式返回每一层节点值之和的平 ...
- 力扣算法题—111.Minimum Depth of Binary Tree
Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the sh ...
- 数据结构《9》----Threaded Binary Tree 线索二叉树
对于任意一棵节点数为 n 的二叉树,NULL 指针的数目为 n+1 , 线索树就是利用这些 "浪费" 了的指针的数据结构. Definition: "A binary ...
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- php算法题---对称的二叉树
php算法题---对称的二叉树 一.总结 一句话总结: 可以在isSymmetrical()的基础上再加一个函数comRoot,函数comRoot来做树的递归判断 /*思路:首先根节点以及其左右子树, ...
- 对称二叉树 · symmetric binary tree
[抄题]: Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). ...
- 数据结构-二叉树(Binary Tree)
1.二叉树(Binary Tree) 是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根节点和两棵互不相交的,分别称为根节点的左子树和右子树的二叉树组成. 2.特数二 ...
随机推荐
- ExtJS 4 MVC 官方示例
参考原文翻译地址:http://www.showframework.com/2012/07/extjs-mvc-architecture/ 效果图 代码结构: 源代码下载: http://hot.ba ...
- Java 集合系列
1.http://www.cnblogs.com/skywang12345/p/3308498.html
- bzoj 3205: [Apio2013]机器人【dfs+斯坦纳树+spfa】
第一次听说斯坦纳树这种东西 先dfs预处理出来dis[i][j][k]表示格子(i,j)向k方向转移能到哪,记忆话搜索预处理,注意如果有环的话特判一下 设f[i][j][x][y]表示复合机器人i-j ...
- 51nod 1239 欧拉函数之和【欧拉函数+杜教筛】
和bzoj 3944比较像,但是时间卡的更死 设\( f(n)=\sum_{d|n}\phi(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\phi(i) ...
- java基础类型数据与String类包装类之间的转换与理解
数据类型转换一般分为三种: 在java中整型,实型,字符型视为简单数据类型,这些数据类型由低到高分别为:(byte,short,char--int-long-float-double) 简单数据类型之 ...
- 图论/位运算 Codeforces Round #285 (Div. 2) C. Misha and Forest
题目传送门 /* 题意:给出无向无环图,每一个点的度数和相邻点的异或和(a^b^c^....) 图论/位运算:其实这题很简单.类似拓扑排序,先把度数为1的先入对,每一次少一个度数 关键在于更新异或和, ...
- 题解报告:hdu 1284 钱币兑换问题(简单数学orDP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1284 Problem Description 在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很 ...
- Ubuntu卸载软件包
sudo apt-get autoremove --purge mysql-server-5.0 ,purge连同配置文件一起删除,autoremove自动卸载依赖包sudo apt-get remo ...
- PHP使用Session遇到的一个Permission denied Notice解决办法
搜索 session.save_path 在这里你有两个选择,一个是像我一样用; 把这一行注释掉,另一个选择就是修改一个 nobody 用户可以操作的目录,也就是说有读写权限的目录,我也查了下这个默认 ...
- 调用wsdl接口,参数是xml格式
1.最近太累了,好困.闲话少许直奔主题吧.上代码 try{ String wsurl = "http://172.16.16.236:9999/xxx/ws/WSService?wsdl&q ...