假期ing:2020.1.10

1.前言

数据结构期末考了线索二叉树,现在重新整理一下,很久以前写了,今天才把余下的bug解决掉。


2.二叉线索树简单概念讲解

只利用简单三元结构体的设置,我们很难直接找到每个节点的双亲结点,因此,出现了一种线索二叉树,顾名思义就是有一条线索够我们使用,便于查找任意结点。

一棵二叉链表表示的二叉树有n + 1个空指针,可以利用这些空指针来存储节点的前驱和后继,这个就是所谓的线索。然而呢,为了区分是线索还是孩子指针,我们需要在结构体内设置标志位,用来区分这两种情况。标志位如同 ltag 和rtag,标志位为零,可以表示指的是线索,二标志位为一可以表示指的是孩子节点。其中lchild指向前驱,rchild指向后继。对儿二叉树的某种遍历使其成为线索二叉树的过程也就是所谓的线索化。


3.将一棵二叉树线索化的步骤

  1. 设前驱指针为空,当前指针为树根;
  2. 按某种顺序遍历二叉树;
  3. 若当前结点的左子树为空,则将标志位ltag置为零,并且将前驱指针赋值给lchild;
  4. 若前驱结点的右子树为空,则将标志位rtag置为零,并将当前指针赋值给rchild;
  5. 将当前指针赋值给前驱指针;
  6. 反复此过程,直至整棵二叉树遍历完为止;
  7. 将前驱结点的标志位rtag置为1 。

也可以为线索二叉树设置一个头结点,则线索为空时均指向该头结点。(此处不涉及该内容。)


4.代码实现

#include<iostream>
#include<algorithm>
using namespace std;
typedef struct Node TreeNode;
typedef struct Node* Tree;
struct Node {int value;Tree lchild;Tree rchild;int ltag, rtag;
};
Tree pre = NULL;//前驱—全局变量
void InordefThreading(Tree& Trt, Tree root);//中序遍历线索化
void InTreading(Tree root);//线索化
void Print(Tree root);//中序遍历输出
Tree CreateTree(char str[],int &i); //创建二叉树
int main()
{int i = 0;char TREE[50] = "FBA00DC00E00JHG00I00K00";Tree root = CreateTree(TREE,i);InTreading(root);//线索化printf("输出中序序列:\n");Print(root);system("pause");return 0;
}
Tree  CreateTree( char TREE[50],  int  &i )
{   Tree  root;char  ch;if  ( TREE[0] == '-' )  cin >> ch;  else  ch = TREE[i++];if  ( ch == '0' )  root = NULL;  else{   root = new  TreeNode;root->value = ch;root->lchild = CreateTree( TREE, i );root->rchild = CreateTree( TREE, i );}return root;
}
void InTreading(Tree root)
{if (root){InTreading(root->lchild);//左子树线索化if (!root->lchild)//前驱线索{root->ltag = 1;root->lchild = pre;//第一次的时候,很明显,中序遍历的第一个节点是没有前驱的,因此为空指针}if (pre && !pre->rchild)//后继线索,如果 pre 没有右孩子,右标志位设为 1,右指针域指向当前结点{pre->rtag = 1;pre->rchild = root;}pre = root;//前驱更新InTreading(root->rchild);//右子树线索化}return;
}
void Print(Tree root)
{while (root){while (root->ltag == 0)//寻找中序输出的第一个节点root = root->lchild;printf("%c ", root->value);//输出该节点值while (root->rtag == 1 && root->rchild != NULL)//当右标志为一1时,直接找到其后继节点{root = root->rchild;printf("%c ", root->value);}root = root->rchild;//寻找右子树最左下的节点,继续循环即可}return;
}

5.运行结果实现


c语言--线索二叉树相关推荐

  1. c语言线索二叉树作用,C语言递归实现线索二叉树

    本文实例为大家分享了C语言递归实现线索二叉树的具体代码,供大家参考,具体内容如下 描述:将二叉树中结点的空左孩子指针域指向前驱结点,将空的右孩子指针域指向后继结点. code: #pragma war ...

  2. C语言线索二叉树的实现

    线索二叉树的主要操作,包含:以p为根节点的子树中序线索化,带头结点的二叉树中序线索化和遍历线索二叉树这几个函数. 下面讲一下实现代码: 首先,依然是类型定义,并声明一个全局变量pre: typedef ...

  3. c语言线索二叉树作用,线索二叉树(C语言)

    实现下面这棵树: 先序遍历: A B C D E F 中序遍历: C B D A E F 代码 #include #include #include #include typedef enum {li ...

  4. c语言 怎么输出结点,c语言 线索二叉树 输入结点 输出前驱后继,大神们救命啊!!1...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include //定义结构体 typedef struct BiThrNode { int data; struct BiThrNo ...

  5. C语言实现线索二叉树Threaded Binary Tree (附完整源码)

    C语言实现线索二叉树Threaded Binary Tree 树节点定义 实现以下7个接口 完整实现和main测试源码 树节点定义 typedef struct Node {int data; /** ...

  6. 线索二叉树详解(C语言版)

    文章目录 一.定义 二.结构 三.常用操作 结语 附录 一.定义 前面学习了二叉树,在操作过程中发现了几个问题: 问题一:二叉树如何才能实现从一个指定结点开始遍历呢?         问题二:在二叉树 ...

  7. 怎样用C语言实现线索二叉树

    在实现线索二叉树时,需要在二叉树的结点中增加两个指针,分别指向前驱结点和后继结点. 下面是一个线索二叉树的结构体定义: typedef struct ThreadNode {char data;str ...

  8. C语言数据结构之线索二叉树

    C语言数据结构之线索二叉树 tips:前些天学习了二叉树的相关操作,今天来总结一下线索二叉树的操作. 线索二叉树:对二叉树以某种次序遍历得到序列中的前驱和后继,其中指向结点前驱和后继的指针称为线索,再 ...

  9. C语言实现二叉树的中序线索化及遍历中序线索二叉树

    C语言实现二叉树的线索化以及如何遍历线索二叉树! 文章目录 线索二叉树的结构及数据类型定义 根据输入结点初始化二叉树 中序遍历二叉树并线索化 遍历中序线索二叉树 项目完整代码 项目完整代码(改进版) ...

最新文章

  1. Jittor 的Op, Var算子
  2. AlwaysUp使用方法
  3. iphone的生命周期
  4. [中文版] 可视化 CSS References 文档
  5. 前端学习(2560):理解虚拟dom和key
  6. 【今日CV 计算机视觉论文速览 143期】Mon, 15 Jul 2019
  7. PSIM软件学习---01初识别PSIM软件
  8. 关于jacob支持BSTR类型的经验总结
  9. Java集合框架源码解读(5)——TreeMap
  10. hardmard积 用什么符号表示_[关于数学哲学的科普]为数学学习准备的基础数理逻辑(用自然推理系统展现的命题演算以及一阶谓词演算)...
  11. java全栈_java全栈的知识技能
  12. iMazing怎么恢复备份?iMazing恢复备份教程分享
  13. windows远程会话已断开连接,因为访问被拒绝导致许可证存储的创建失败。请使用提升的权限运行远程桌面客户端—解决方法
  14. matlab怎么输入斜杠,如何实现Matlab的mldivide(又称反斜杠运算符“ \”)
  15. 操作系统|时间片轮转调度算法(RR)
  16. 4.3 走出应试的阴影——《逆袭大学》连载
  17. chart.js画图
  18. 小白终是踏上了这条不归路----小文的mysql学习笔记目录
  19. 谈谈360与QQ之我见
  20. 期望 UVA - 11427 - 独立重复事件-全期望公式

热门文章

  1. 用egret制作一款跑酷类游戏(一)
  2. 智能安全用电技术电气火灾监控的应用介绍 安科瑞 许敏
  3. ios含有支付_苹果APP Store审核提示包含第三方支付Alipay被拒
  4. golang使用ffmpeg视频压缩
  5. NGUI UI动画笔记
  6. 斗地主分牌洗牌(python)
  7. 时间服务器中,适用于国内的 NTP 服务器地址,可用于时间同步或 Android 加速 GPS 定位
  8. 收钱吧的 Python 高效自动化测试实践
  9. Total3DUnderstanding: 单图像室内场景的联合布局、物体姿态和网格重建
  10. C语言之数组的定义及其使用方法