线索二叉树

线索二叉树的一些思考

不想你离开。 提交于 2020-04-06 21:51:03
将一棵二叉树线索化,能加快找前驱和后继的速度,这就是线索二叉树和普通二叉树相比,它最大的优势。 下面将主要讲述如何找前驱和后继、如何将二叉树线索化。 中序的前驱和后继 1)对于中序线索二叉树,它的前驱为:左子树按照中序遍历最后一个节点 2)他的后继为:右子树按照中序遍历第一个节点 如何找第一个节点和最后一个节点(中序) 1)第一个节点 一直往左走,最左边的即为第一个节点 2)最后一个节点 一直往右走,最右边的即为最后节点 对于前序和后序 1)前序的后继节点 若有左孩子,则为左孩子;若只有右孩子,则为右孩子。若为叶结点,则右链域直接指示了节点的后继。 2)后序的前驱节点 若有右孩子则为右孩子,没有有孩子只有左孩子则为左孩子。若该节点为叶结点,那它的左链域直接指示了节点的前驱。 如何将一颗二叉树线索化 设立指针pre指向刚刚访问过的节点,指针p指向正在访问的节点。pre即为p的前驱。在中序遍历中,检查p的做指针是否为空,若为空:p->left = pre;检查pre的右指针是否为空,若为空:pre->right = p;这是一个递归的过程。    来源: https://www.cnblogs.com/strive408/p/12648599.html

线索二叉树

时光总嘲笑我的痴心妄想 提交于 2020-03-01 17:57:01
头文件 #pragma once #include <stdio.h> #include <stdlib.h> //函数状态结果代码 #define TRUE_THR 1 #define FALSE_THR 0 #define OK_THR 1 #define ERROR_THR 0 #define INFEASIBLE_THR -1 #define OVERFLOW_THR -2 //Status是函数的类型;其值是函数结果状态代码 typedef char TElemType; typedef enum {Link, Thread} PointerTag; typedef struct BiThrNode { TElemType data; struct BiThrNode* lchild, * rchild; PointerTag LTag; PointerTag RTag; }BiThrNode, *BiThrTree; //线索二叉树初始化 int CreateBiThrNode(BiThrTree* B); //线索二叉树线索化 void InThreading(BiThrTree B, BiThrTree* pre); //为线索二叉树添加头结点,使之可以双向操作 int InOrderThreading(BiThrTree* Thrt, BiThrTree T);

线索化二叉树的概念以及前序线索化

最后都变了- 提交于 2020-02-29 01:45:37
** 二叉树和线索化二叉树 ** 以此谨记自己学习java心得 什么是二叉树,用我自己的话说。一般简单数据结构是数组和链表,昨天学了哈希表,是一个数组加上一个单向链表完成的。但是哈希表在查找某单元时,需要从头找到尾。而二叉树可以根据大小来分配,像链表里的结构一般是有previous 和next。而二叉树则是left和right。又因为考虑到完全二叉树的最后一排以及倒数第二排的一些元素,它们的指针是空的,也就是浪费了left和right内存空间,线索二叉树则将这些没有指向具体的内存的left和right给用了起来。 如图中8,10,14的left和right没有充分利用,6的right没有充分利用,在线索化二叉树中,根据前序、中序、后序可将这些left,right分别指向排列时元素的前驱和后继。 比方说,若按前序排序(可理解为 先中再左再有右):1,3,8,10,6,14。在该排序中则将8的left 指向3,8的right指向10。6的right指向14.依次类推。中序和后序的话,也是按照排序的先后,将left指向前驱,将right指向后继。 注:若某结点原本就有指向其他地址的left或者right,则这些有指向left或right原封不动。 在这里张贴一下自己的前序排序线索化的代码。 public void prologue ( HeroNode node ) { if (

线索二叉树

萝らか妹 提交于 2020-02-20 05:50:19
1.产生背景 现有一棵结点数目为n的二叉树,采用二叉链表的形式存储。对于每个结点均有指向左右孩子的两个指针域,而结点为n的二叉树一共有n-1条有效分支路径。那么,则二叉链表中存在2n-(n-1)=n+1个空指针域。那么,这些空指针造成了空间浪费。 例如:图1所示一棵二叉树一共有10个结点,空指针^有11个。 此外,当对二叉树进行中序遍历时可以得到二叉树的中序序列。例如:图2.1所示二叉树的中序遍历结果为HDIBJEAFCG,可以得知A的前驱结点为E,后继结点为F。但是,这种关系的获得是建立在完成遍历后得到的,那么可不可以在建立二叉树时就记录下前驱后继的关系呢,那么在后续寻找前驱结点和后继结点时将大大提升效率。 2.线索化 现将某结点的空指针域指向该结点的前驱后继,定义规则如下: 若结点的左子树为空,则该结点的左孩子指针指向其前驱结点。 若结点的右子树为空,则该结点的右孩子指针指向其后继结点 这种指向前驱和后继的指针称为线索。将一棵普通二叉树以某种次序遍历,并添加线索的过程称为线索化。 按照规则将图1所示二叉树线索化后如图2所示 图中黑色点画线为指向后继的线索,紫色虚线为指向前驱的线索。 可以看出通过线索化,既解决了空间浪费问题,又解决了前驱后继的记录问题。 3.线索化带来新问题 经过上一节讲解后,可以将一棵二叉树线索化为一棵线索二叉树,那么新的问题产生了

树结构之线索化二叉树

馋奶兔 提交于 2020-02-02 08:11:55
数列 {1, 3, 6, 8, 10, 14 } 构建成一颗二叉树 当对上面的二叉树进行中序遍历时,顺序为: 8, 3, 10, 1, 6, 14 ,但是 6, 8, 10, 14 这几个节点的 左右指针,并没有完全的利用上 . 如 果希望充分的利用 各 个节点的左右指针, 让各个节点可以指向自己的前后节点,该怎么办? 解决方案: 线索二叉树 中序线索化后: 1、 n 个结点的二叉链表中含有 n+1 【 公式 2n- (n-1)= n+1】 个 空指针域。利用二叉链表中的空指针域,存放指 向 该 结点 在 某种遍历次序 下的前驱和后继结 点的指针( 这种附加的指针称为 " 线索 " ) 2、这种加上了线索的二叉链表称为 线索链表 ,相应的二叉树称为 线索二叉树 (Threaded BinaryTree ) 。根据线索性质的不同,线索二叉树可分为 前序线索二叉树、中序线索二叉树 和 后序线索二叉树 三 种 3、一个结点的前一个结点 ,称为 前驱 结点 4、一个结点的后一 个结点 ,称为 后继 结点 注意: 1、left 指向的是左子树,也可能是指向的前驱节点 . 比如节点1的 left 指向的左子树 , 而节点10的 left 指向的就是前驱节点 . 2、right指向的是右子树,也可能是指向后继节点,比如 节 点1的 right 指向的是右子树,而节点10的 right

线索二叉树

耗尽温柔 提交于 2020-01-30 00:11:58
线索二叉树 由于具有 N N N 个节点的二叉查找树有 N + 1 N+1 N + 1 的 N U L L NULL N U L L 指针,因此在二叉查找树中指定给指针信息的空间的一半被浪费了。 若一个节点有一个 N U L L NULL N U L L 左孩子,我们使它的左儿子指向它的 中缀前驱(inorder predecessor) ,若一个节点有一个 N U L L NULL N U L L 右孩子,我们让它的右儿子指向它的 中缀后继(inorder successor) 。这就叫做 线索二叉树(threaded tree) ,而附加的指针就叫做 线索(thread) 。 为使从实际的儿子指针中区分出线索,需要在每个节点增加一个成员,用以标志指针是线索还是孩子。 typedef enum { Linked , // 表示正常孩子 Thread // 表示线索 } PointerTag ; typedef int ElementType ; struct ThreadTree ; typedef struct ThreadTree * Tree ; typedef struct ThreadTree * Position ; struct ThreadTree { ElementType Element ; Tree Left ; Tree Right ;

遍历线索化二叉树

爷,独闯天下 提交于 2020-01-28 18:30:08
遍历线索化二叉树 常规的线索化方式 采用递归地调用的方式,判定条件是当前指针的左子树是否为空 代码实现: public void midOrder ( ) { if ( this . left != null ) { this . left . midOrder ( ) ; } System . out . println ( this ) ; if ( this . right != null ) { this . right . midOrder ( ) ; } } 对比: 但是对二叉树进行线索化之后,不存在空的左右指针,但是单独设置每一个指针的类型,故而条件修改为指针的类型。 代码实现 我的代码 public void midLIst ( ) { if ( this . getLeftType ( ) != 1 ) { this . getLeft ( ) . midLIst ( ) ; } System . out . print ( this + " " ) ; if ( this . getRightType ( ) != 1 ) { this . getRight ( ) . midLIst ( ) ; } } 问题分析与总结: 出现空指针异常,因为到最后一个节点时,其右指针是没有改变,仍旧为null,并且没有对其值进行修改,故而会出现空指针。 代码修改 public

数据结构之线索二叉树的前序,中序和后序遍

两盒软妹~` 提交于 2020-01-19 17:43:34
二叉树是一种非线性结构,在之前实现的二叉树遍历中不管是递归还是非递归用二叉树作为存储结构时只能取到该结点的左孩子和右孩子,不能得到该结点的前驱和后继。为了保存这种在遍历中需要的信息,同时也为了充分利用结点中的空指针域,我们利用二叉树中指向左右子树的空指针来存放结点的前驱和后继.同时在有n个结点的二叉链表中必定存在n+1个空链域. 那仫问题来了如何充分的利用这些空链域来实现线索化呢? 假设做如下规定:若结点有左子树则其左孩子域指向该结点的左孩子,否则另左孩子指向其前驱;若结点有右子树则其右孩子域指向该结点的右孩子,否则另右孩子域指向其后继.为了实现这种构想我们需要增加两个标志域_leftTag,_rightTag. 一.线索化及中序遍历一棵树 要线索化一颗二叉树,最重要的就是在访问了当前结点并确定当前结点的左孩子域或者右孩子域为空后如何找到当前结点的前一个结点也就是它的前驱,和当前结点的后继.在这里我们用到了一个_prev指针用来保存你访问结点的前一个结点--如果当前结点的左子树域为空则使当前结点的左孩子域指向_prev所指向的结点也就是当前结点的前驱;我们知道中序是按照左-根-右的顺序遍历的,如果当前结点的左访问过了,根也访问过了按照中序遍历的顺序接下来就应该访问右了-_prev指针指向的是当前结点的前一个结点要访问右则只需判断_prev的右孩子域是否为空就可以了,如果为空则使

数据结构:线索二叉树的遍历

这一生的挚爱 提交于 2020-01-19 07:03:12
题目: 中序线索化上述二叉树并找出根结点的前驱和后继。 思路: (1)利用递归函数创建一颗普通的二叉树 (2)1.左子树线索化(返回修改后的pre); 2.当前结点p线索化 建前驱线索(当前结点左空,指向pre); 建后继线索(pre右空,pre指向当前结点); 重新修改前驱结点p指针为 pre; 3.右子树线索化(将新的pre输入) (4)将pre的右标志数置1,右子树置NULL。 (5)将该线索树进行中序遍历,并将结果依次放入vector中 (6)在vector中查找相对应的结点值,前后值则分别为前驱和后置,同时对可能的错误和特殊情况进行处理。 代码块: # include "pch.h" # include <iostream> # include <vector> using namespace std ; vector < char > tmp ; struct Btree { //二叉树结构 char data ; Btree * lchild ; Btree * rchild ; int ltag ; int rtag ; } ; void create ( Btree * & t ) //创建二叉树 { char data ; cin >> data ; t = new Btree ; if ( data == '#' ) t = NULL ; //以#为终止符号

数据结构基础概念篇

半城伤御伤魂 提交于 2019-12-21 23:46:01
数据结构基础概念篇 原创 小草莓lllll 发布于2017-11-14 13:44:24 阅读数 158267 收藏 更新于2017-11-14 13:44:24 分类专栏: 数据结构与算法 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_31196849/article/details/78529724 展开 <h1 id="数据结构"><a name="t0"></a><a name="t0"></a>数据结构</h1> 一些概念 数据结构就是研究数据的 逻辑结构 和 物理结构 以及它们之间 相互关系 ,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。 数据:所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。 数据元素:数据(集合)中的一个“个体”,数据及结构中讨论的 基本 单位 数据项:数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。 数据类型:在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等等 逻辑结构:数据之间的相互关系。 集合 结构中的数据元素除了同属于一种类型外,别无其它关系。 线性结构 数据元素之间一对一的关系 树形结构 数据元素之间一对多的关系