优势:便于在中序遍历下,查找前驱和后继

前驱/后继含义:AB中,A是B前驱,B是A后继。

ltag=0时:lchild指向左孩子                ltag=1时:lchild指向前驱

rtag=0时:rchild指向右孩子                rtag=1时:rchild指向后继

过程:

1、先前序遍历创建二叉树

2、线索化二叉树

3、线索二叉树中序遍历输出

总代码:

//线索二叉树
//优势:便于在中序遍历下,查找前驱和后继
#include<stdio.h>
#include<malloc.h>
#include<string>int index = 0;
int first = 1;
char str[30];
typedef enum { Link, Thread } PointerTag;               //0:Link(指向结点)     1:Thread(指向线索)typedef struct BiThTree
{char data;struct BiThTree* lchild, * rchild;                   //左孩子、右孩子PointerTag ltag, rtag;                                 //0:指向左/右孩子;  1:指向前驱/后继struct BiThTree* parent;                                //指向双亲结点
}BiThTree;
BiThTree* head;     //头
BiThTree* Pre;          //前一个结点void Init_BiThTree()
{head = (BiThTree*)malloc(sizeof(BiThTree));head->parent = head;
}//前序遍历创建二叉树
void Create_BiThTree(BiThTree* T)
{if (str[index] == '#')     //空{T->data = str[index++];return;}T->parent = Pre;                                   //保存前一个结点T->data = str[index++];T->lchild = (BiThTree*)malloc(sizeof(BiThTree));T->rchild = (BiThTree*)malloc(sizeof(BiThTree));T->ltag = Link;T->rtag = Link;Pre = T;                                           //保存前一个结点Create_BiThTree(T->lchild);Create_BiThTree(T->rchild);
}//线索化二叉树(中序)
void InThreading(BiThTree* T)
{//如果存在if (T->data != '#'){InThreading(T->lchild);                 //递归左子树//线索化左if (T->lchild->data == '#')              //lchild为空,lchild指向前驱{T->ltag = Thread;                      //线索模式if (first)                                            //首个赋空{T->lchild->data = '#';first = 0;}elseT->lchild = Pre;                      //lchild指向前驱}//线索化右else if (Pre->rchild->data == '#') //前驱的rchild为空,前驱的rchild指向后继{Pre->rtag = Thread;                  //线索模式Pre->rchild = T;                          //rchild指向后继}Pre = T;InThreading(T->rchild);                    //递归右子树}
}//线索二叉树中序遍历
void InOrderThTraverse(BiThTree* T)
{if (T->data != '#'){if (T->ltag == Link)InOrderThTraverse(T->lchild);printf("%c结点   \tlchild:%c\trchild:%c\n", T->data, T->lchild->data, T->rchild->data);if (T->rtag == Link)InOrderThTraverse(T->rchild);}
}int main()
{printf("请按照前序遍历顺序输入需要创建的二叉树结点:\n");scanf_s("%s", str, 20);Init_BiThTree();                              //初始化Create_BiThTree(head);             //前序遍历创建二叉树Pre = head;InThreading(head);                       //中序线索化二叉树InOrderThTraverse(head);          //线索二叉树中序遍历
}

数据结构与算法(6-4)线索二叉树相关推荐

  1. 《数据结构与算法》——树与二叉树之遍历总结

    <数据结构与算法>--树与二叉树之遍历总结 树与二叉树部分计划分为三次进行复习总结,第一次为基本概念和二叉树的遍历,第二次内容为线索二叉树以及树和森林,第三次为树与二叉树的应用. 目录 & ...

  2. 数据结构与算法(八)-二叉树(斜二叉树、满二叉树、完全二叉树、线索二叉树)...

    前言:前面了解了树的概念和基本的存储结构类型及树的分类,而在树中应用最广泛的种类是二叉树 一.简介 在树型结构中,如果每个父节点只有两个子节点,那么这样的树被称为二叉树(Binary tree).其中 ...

  3. PTA数据结构与算法题目集 6-9 二叉树的遍历

    PTA数据结构与算法题目集(中文) 6-9 二叉树的遍历 void InorderTraversal( BinTree BT ){if(BT==NULL)return;if(BT->Left){ ...

  4. 数据结构与算法:树与二叉树python实现

    最近复习一遍数据结构与算法,做一些笔记,大家可以一起复习. 一.树的一些容易混淆的定义: 结点层:根结点的层定义为1:根的孩子为第二层结点,依此类推: 树的深度(或高度):树中最大的结点层: 满二叉树 ...

  5. 数据结构与算法--解决问题的方法- 二叉树的的镜像

    解决问题的思路 工作中遇到的问题可能用到的数据结构由很多,并且各种数据结构都不简单,我们不可能光凭借想象就能得到问题的解法,因此画图是在家具问题过程中用来帮助自己分析,推理的常用手段.很多问题比较抽象 ...

  6. 数据结构与算法(1)--二叉树

    博客记录的第一个算法: 实现二叉树数据结构,以及深度优先搜索和广度优先搜索算法(非科班小白,努力中....)  class BT_Node: def __init__(self, data, left ...

  7. LeetCode 【数据结构与算法专栏】【二叉树】

    刷题笔记 二叉树算法专栏 leetcode 814. 二叉树剪枝 leetcode上二叉树的建树测试代码 leetcode 94 二叉树的中序遍历 leetcode 144 二叉树的前序遍历 leet ...

  8. Java数据结构和算法(十)——二叉树

    接下来我们将会介绍另外一种数据结构--树.二叉树是树这种数据结构的一员,后面我们还会介绍红黑树,2-3-4树等数据结构.那么为什么要使用树?它有什么优点? 前面我们介绍数组的数据结构,我们知道对于有序 ...

  9. 《数据结构与算法》实验报告——二叉树的遍历

    <数据结构>实验报告 学号:2018329621200 机房号10-414 姓名: 申屠志刚 日期:2019/11/4 程序名:main.cpp 实验内容: 二叉树的遍历 一.目的和要求( ...

  10. 数据结构和算法(06)---二叉树(c++)

    文章目录 目录 二叉树 1.二叉树的基本概念 2.二叉树的应用和时间复杂度 3.二叉树的插入 4.二叉树的查找 5. 二叉树的遍历 6.二叉树的删除 二叉树的基本操作 1.二叉树的基础操作 2.代码实 ...

最新文章

  1. rdp协议打开 windows_RDPY - Twisted Python 实现的RDP协议(Windows 远程桌面)
  2. shell脚本中执行mysql 语句,去除warning using a password on the command line interface can be insecure信息...
  3. POJ 3259 Wormholes【最短路/SPFA判断负环模板】
  4. 高斯背景建模 matlab,高斯背景建模整理 – 要饭的
  5. 对怀孕的人有害的食物。。。朋友们记住咯!(欢迎转载)
  6. STM32 设置片外SRAM分散加载
  7. python --version没输出_如何在Linux上安装Python
  8. unix linux系统版本,怎么查看UNIX系统版本?
  9. clickhouse-小结 mutation操作 视图
  10. 开课吧:Web开发要学习哪些基础知识?
  11. 蓝桥杯国赛之阶乘位数
  12. python教程简书_python基础教程
  13. Python和Ruby语言对比
  14. OpenCV里IplImage数据结构中width和widthStep极易出错的问题
  15. 如何实现Windows 和 Linux 共享文件夹
  16. vs vsvim viemu vax 备忘
  17. Python文件去重代码
  18. 在邮箱中用html写邮件
  19. 邮件服务器如何搭建?企业自己搭建邮件服务器的方法
  20. Android 使用图片缓存,避免OOM(实现照片墙)

热门文章

  1. Android - 下载别人的android demo 运行的时候加载很久问题处理
  2. Android 属性动画(Property Animation) ObjectAnimator的介绍
  3. RecyclerView 的findFirstVisibleItemPosition()与findLastVisibleItemPosition()
  4. 微信小程序 view中的image水平垂直居中
  5. PYTHON自动化Day12-unittest自动注册登录
  6. NOIP模拟 数球(思维题)
  7. Go 学习笔记(20)— Go 操作 json 文件(编码生成 json、解码 json 为 map、解码 json 为 struct)
  8. Go 学习笔记(4)— Go 标识符、数据类型之间转换、布尔型、整型、浮点型、interface 类型
  9. 如何配置FastReport.Net环境
  10. innodb force recovery