线索二叉树

线索二叉树 C++

最后都变了- 提交于 2019-12-13 13:01:59
线索二叉树 C++ 以此二叉树为例进行创建: 前序法创建节点,输入’#'表示为NULL 用前序创建的话需要输入 :ABD##E##C#G## 前序遍历:ABD##E##C#G## 中序遍历:#D#B#E#A#C#G# 后序遍历: ##D##EB###GCA 层序遍历: ABCDEG 在进行线索二叉树线索化的过程中我们并不设置 头结点, 而是**直接设置一个全局变量 指针 Prev **, 表示指向上一个节点的位置 。 思想: 1.首先对创建好的二叉树利用一次中序遍历的过程设置好 lTag 与 rtag 。 在这个过程中 T指针负责设置 T->ltag(前驱), prev指针负责设置 prev->rtag(后继) 2.中序线索二叉树的遍历 ,由于设置了前驱和后继,就可以不使用栈, 直接用 迭代法 进行中序遍历。 ThreadBiTree.h # pragma once # include <iostream> using namespace std ; # define MAX 30 typedef char ElemType ; typedef struct ThreadBiNode { ElemType data ; struct ThreadBiNode * lchild , * rchild ; int ltag , rtag ; //0表示正常连接孩子, 1表示前缀后缀

线索二叉树的基本概念和构造

人走茶凉 提交于 2019-12-11 06:00:47
全书链接: 408笔记——数据结构(C语言版)(将书上例题用C语言列出来,可以直接在IDE(Xcode)上运行) 文章目录 1.基本概念 2.构造 3.在中序线索树中找结点的直接前驱和后继 4.线索化二叉树 5.线索化二叉树的遍历 1.基本概念 2.构造 3.在中序线索树中找结点的直接前驱和后继 4.线索化二叉树 5.线索化二叉树的遍历 来源: CSDN 作者: 星星月亮0 链接: https://blog.csdn.net/baidu_40537062/article/details/103457196

线索二叉树

本秂侑毒 提交于 2019-12-05 00:19:42
2019/11/19 线索二叉树 概念: 对二叉树以某种次序遍历使其变为线索二叉树的过程,称为 线索化 。 线索化: 若无左子树,则将左指针→指向其前驱结点; 若无右子树,则将右指针→指向其后继结点; 先序 线索化: 中序 线索化: 这里有两个空指针:结点4的前驱指针(左指针)、结点3的后继指针(右指针)。 后序 线索化: 未完待续...... 中序遍历序列和层次遍历序列 来源: https://www.cnblogs.com/LinQingYang/p/11890891.html

线索二叉树C++实现

ⅰ亾dé卋堺 提交于 2019-12-04 12:17:43
#include<iostream> #include<stdlib.h> #define maxsize 100 using namespace std; typedef struct BTNode{ char val; struct BTNode *lchild, *rchild; int ltag, rtag; }BTNode, *BiNode; BTNode* stack[maxsize]; int top = -1; /** * 找到中序遍历的第一个起始顶点 */ inline BTNode* First(BTNode *root){ while(root->ltag == 0) root = root->lchild; return root; } /** * 找到中序遍历的下一个顶点,树已被中序线索化 */ inline BTNode* InOrderNext(BTNode *root){ if(root->rtag == 0) return First(root->rchild); else return root->rchild; } /** * debug,用来打印线索化之后的树的信息 */ inline void debug(){ for(int i = 0; i <= top; i++){ cout << "[debug]: BTNode->["; cout

数据结构学习之线索二叉树(java/c++版)

我的未来我决定 提交于 2019-12-03 15:38:44
#include <iostream> #include <windows.h> using namespace std; #pragma warning(disable:4996) //可不可以利用c++的泛化编程的思想去改边它 typedef int Tree_type; //树中的存储结构的类型(先去掉---用泛化的思想) //注意枚举和结构体一样的命名和定以方式 typedef enum PoitnterTag { link, Thread } PointerTag; //注意----当二叉树遇到中序遍历时就自动排好序了 //template<class Tree_type> typedef struct Tree { Tree_type data; //要存储的结构 Tree *Left; //左孩子 Tree *Right; //右孩子 PointerTag LTag; //左标志位 PointerTag RTag; //右标志位 } Tree, *PTree; //template <class Tree_type> //标志位的定义应该在树形成之后去定义---根据是否有左右结点指针去为其赋值 PTree pre = NULL; //在此定义一个全局变量去保留上一个的结点 bool Threading(PTree &T) { if (T) /

数据结构――一些概念

匿名 (未验证) 提交于 2019-12-03 00:39:02
数据结构就是研究数据的 逻辑结构 和 物理结构 以及它们之间 相互关系 ,并对这种结构定义相应的运算,而且确保经过这些运算后所得到的新结构仍然是原来的结构类型。 数据:所有能被输入到计算机中,且能被计算机处理的符号的集合。是计算机操作的对象的总称。 数据元素:数据(集合)中的一个“个体”,数据及结构中讨论的 基本 单位 数据项:数据的不可分割的最小单位。一个数据元素可由若干个数据项组成。 数据类型:在一种程序设计语言中,变量所具有的数据种类。整型、浮点型、字符型等等 逻辑结构:数据之间的相互关系。 集合 结构中的数据元素除了同属于一种类型外,别无其它关系。 线性结构 数据元素之间一对一的关系 树形结构 数据元素之间一对多的关系 图状结构或网状结构 结构中的数据元素之间存在多对多的关系 物理结构/存储结构:数据在计算机中的表示。物理结构是描述数据具体在内存中的存储(如:顺序结构、链式结构、索引结构、哈希结构)等 在数据结构中,从逻辑上可以将其分为线性结构和非线性结构 数据结构的基本操作的设置的最重要的准则是, 实现应用程序与存储结构的独立 。实现应用程序是“逻辑结构”,存储的是“物理结构”。逻辑结构主要是对该结构操作的设定,物理结构是描述数据具体在内存中的存储(如:顺序结构、链式结构、索引结构、希哈结构)等。 顺序存储结构中,线性表的逻辑顺序和物理顺序总是一致的。但在链式存储结构中

二叉树的线索化思想解析与代码实现

雨燕双飞 提交于 2019-12-02 06:47:01
二叉树线索化 思想重于代码:写程序是为了验证思想,这里讲解部分比较多,还望耐心哈!! 二叉树线索化目的是想将二叉树的中序遍历不用递归方式实现,同时也充分的利用叶子结点的左右孩子空间,但是需额外引入一个标志,该标志用于判断该结点的左右孩子是线索连接的前驱后继还是直接连接左右孩子。并通过该链表将中序遍历的结点连成一条链,即遍历链表相当于二叉树的中序遍历。 问题:为什么要引入线索化这个概念? 1.对叶子的左右孩子的充分利用 2.当二叉树有大量结点时,需要进行很多次递归调用,需要消耗很大的栈空间。 3.可以直接访问当前结点的前驱后继,不需要重新从根节点往下再次遍历,效率高。 那么如何实现呢? 引入标志位 tag,一般使用枚举类型 enum{ Link,Thread }; Link表示孩子,Thread表示线索指向前驱后继 创建一个普通二叉树(即无线索化) 中序遍历二叉树进行线索化,线索化时需要引入一个辅助结点”pre”,这个结点左孩子一开始指向二叉树的根节点,右孩子指向空,我们知道在线索化时二叉树每个叶子都将被标志位Thread,指向他们的前驱后继,这时候考虑一个问题,在中序遍历时我们是无法知道当前结点的前驱或后继对应的是哪个结点,所以pre变量可以作为上一个结点的缓存。可以发现每一个叶子的前驱需要由pre指定,而后继需要在下一次(中序遍历的下一个结点)进行确定

2xs final

社会主义新天地 提交于 2019-11-30 09:00:04
二叉树学习总结 二叉树的性质 二叉树第 i 层之多有 2^(i-1) 个节点 (满二叉树) 深度为 k 的二叉树之多有 2^k - 1 个节点 假设二叉树度为 0 的节点(终端节点或者叶节点)的个数为 n0, 度为2的节点个数为n2,那么 n0 = n2 + 1。 完全二叉树总节点数为n,深度为 <=log2n + 1 最大整数 n个节点的完全二叉树,对每个节点按照顺序编号,对任意编号i, 若 i=1,表示根节点,无双亲节点;若 i>1,双亲为 <=log2i 的最大整数。 若 2i>n ,无左孩子,否则左孩子为2i; 若 2i + 1>n ,无右孩子,否则右孩子为2i + 1; 二叉树的遍历方法(非递归) 前序遍历 模拟递归的栈实现 void PreOrderTravel (BiTree T) { InitStack (S); p = T; while (p || !IsStackEmpty (S)) { visit (p); //访问根节点 if (p->rchild) PushStack (S, p->rchild); if (p->lchild) p = p->lchild; else Pop(S, p); } } 中序遍历 void InOrderTravel (BiTree T) { InitStack (S); p = T; while (p ||

线索二叉树的建立与遍历

烈酒焚心 提交于 2019-11-29 15:46:25
线索二叉树利用二叉树空余的指针域,来实现二叉树的链式化。然后,就可以通过前驱,后继像双向链表一样根据某种遍历次序对树的结点进行访问。 数据结构: 1 struct node{ 2 int data; 3 struct node* left,*right; 4 int ltag,rtag; //=0时,表明指向子结点;=1时,表示指向前驱/后继 5 } 建立线索二叉树: 不同的遍历顺序,会得到不同的线索二叉树。 一般使第线索链表的头和尾指向NULL(也可以加入一个头指针) 以中序遍历为例: 1 // p:当前结点,pre:前驱结点 ; 对每一个点进行处理(NULL,ltag=0,ltag=1) 2 void CreateNode(node &p,node& pre){ 3 if(p!=NULL){ 4 CreateNode(p->left,pre); // pre进行递归改变!!! 5 // 左子树为空 6 if(p->left==NULL){ 7 p->left=pre; 8 p->ltag=1; 9 } 10 // 建立前驱结点的后继线索 11 if(pre!=NULL && pre->right!=NULL){ 12 pre->right=p; 13 pre->rtag=1; 14 } 15 pre=p; 16 CreateNode(p->right,pre); 17 } 18

线索二叉树

我们两清 提交于 2019-11-28 18:44:57
线索化二叉树的目的是为了让所有的节点的左右指针都有用武之处。一般的前中后序的便利方法并不是用到所有结点的所有指针,而线索化二叉树可以使没有用到的指针赋予新的指向方式。 (1)n个结点的二叉树有n+1个空指针域,利用二叉树中的空指针域,去存放指向该结点在某中遍历次序下的前驱和后继结点指针(这种附加的指针称为“线索”) (2)这种加上了线索的二叉树称为线索化二叉树。根据线索执行性质可以分为前序线索二叉树,中序线索二叉树,后序线索二叉树三种。 (3)一个结点的前一个结点: 前驱节点 (4)一个结点的后一个结点: 后继结点 下面通过应用案例深入理解线索化二叉树 将下面的二叉树{}进行中序线索二叉树 package com.tree; /** * created by wyl.. on 2019-08-27 下午 08:28 */ public class ThreadBinaryTree<E> { static class Node<E>{ E e; private Node left; private Node right; private int leftType; private int rigthType; public Node(E e) { this.e = e; } public E getE() { return e; } public void setE(E e) {