目录

线索二叉树概念

——普通二叉树缺点

——中序线索二叉树

——先序线索二叉树

——后序线索二叉树

—— 三种线索二叉树的比较

二叉树的线索化

普通方法代码

中序线索化代码

先序线索化代码

后序线索二叉树代码


线索二叉树概念

——普通二叉树缺点

1、普通二叉树在遍历的时候必须从根节点出发,不能从其中某一点开始遍历。

2、普通二叉树不能快速的找到某个结点的前驱。(可以实现,思路如下)

从根结点出发,重新进行一次中序遍历,指针q记录当前访问的结点,指针pre记录上一个被访的结点 ①当 q == p 时,pre为前驱

②当 pre == p 时,q为后继

缺点是找前驱,后继操作不方便:遍历操作必须从根开始

——中序线索二叉树

n个结点的二叉树,有n+1个空链域!可以用来记录n个前驱、后继的信息

指向前驱、后继的指针称为线索

图示说明

代码如下

//二叉树的结点(链式存储)
typedef struct BiTNode{ElemType date;struct BiTNode *lchild, *rchild
}BiTNode ,*BiTree;
//线索二叉树结点
typedef struct ThreadNode{ElemType date;struct ThreadNode *lchild *rchild;int ltag,rtag;
}ThreadNode,*ThreadTree;

tag == 0 ,表示指针是指向孩子

tag == 1,表示指针是指向“线索”

——先序线索二叉树

和上同理

——后序线索二叉树

和上同理

—— 三种线索二叉树的比较


二叉树的线索化

用土方法找到中序遍历前驱

普通方法代码

//辅助全局变量,用于查找p的前驱
BiTNode *p;  //p指向目标结点
BiTNode * pre = NULL; //指向当前访问结点的前驱
BiTNode * fina = NULL; //用于记录最终结果
void InOrder(BITree T){if(T != NULL){InOrder(T->lchild);  //递归遍历左子树 visit(T);          // 访问根结点 InOrder(T->rchild);  // 递归遍历右子树 }
}
// 访问结点q
void visit(BoTNode *q){if(q == p)         //当前访问的结点刚好是p final = pre;    //找到p的前驱 else pre = q;   //pre指向当前访问的结点
} 

中序线索化代码

当ltag = 0,rtag = 0 的时候,表示没有被线索化


//全局变量,pre指向当前访问结点的前驱
ThreadNode *pre = NULL;
//线索二叉树结点
typedef struct ThreadNode{ElemType data;struct ThreadNode *lchild,*rchild;int ltag,rtag;
}ThreadNode,*ThreadTree;
//中序遍历二叉树,一边遍历一边线索化
void InThread(ThreadTree T){if(T!=NULL){InThread(T->lchild);  //中序遍历左子树 visit(T);             //访问根结点 InThread(T->rchild);  //中序遍历右子树 }
}
void visit(ThreadNode *q) {if(q->lnext == NULL){ //左子树为空,建立前驱线索 q->lchild = pre;q->ltag = 1;}if(pre != NULL && pre->rchild == NULL){pre->rchild = q;     //建立前驱结点后继线索 pre->rtag = 1;}pre = q;
}
//中序线索化二叉树
void  CreateInThread(ThreadTree T){pre = NULL;if(T!=NULL){      //非空二叉树才能线索化 InThread(T);  //中序线索化二叉树 if(pre->rchild==NULL)pre->rtag = 1;    //处理遍历的最后一个结点 }
} 

先序线索化代码

//全局变量,pre指向当前访问结点的前驱
ThreadNode *pre = NULL;
//线索二叉树结点
typedef struct ThreadNode{ElemType data;struct ThreadNode *lchild,*rchild;int ltag,rtag;
}ThreadNode,*ThreadTree;
//先序遍历二叉树
void InThread(ThreadTree T){if(T!=NULL){visit(T);if(t->ltag == 0)preThread(T->lchild);PreThread(T->rchild); }
}
void visit(ThreadNode*q) {if(q->lnext == NULL){ //左子树为空,建立前驱线索 q->lchild = pre;q->ltag = 1;}if(pre != NULL && pre->rchild == NULL){pre->rchild = q;     //建立前驱结点后继线索 pre->rtag = 1;}pre = q;
}//先序线索化二叉树
void  CreateInThread(ThreadTree T){pre = NULL;if(T!=NULL){      //非空二叉树才能线索化 InThread(T);  //先序线索化二叉树 if(pre->rchild==NULL)pre->rtag = 1;    //处理遍历的最后一个结点 }
} 

后序线索二叉树代码

//全局变量,pre指向当前访问结点的前驱
ThreadNode *pre = NULL;
//线索二叉树结点
typedef struct ThreadNode{ElemType data;struct ThreadNode *lchild,*rchild;int ltag,rtag;
}ThreadNode,*ThreadTree;
//后序遍历二叉树,一边遍历一边线索化
void InThread(ThreadTree T){if(T!=NULL){InThread(T->lchild);  //后序遍历左子树 InThread(T->rchild);  //后序遍历右子树 visit(T); }
}
void visit(ThreadNode *q) {if(q->lnext == NULL){ //左子树为空,建立前驱线索 q->lchild = pre;q->ltag = 1;}if(pre != NULL && pre->rchild == NULL){pre->rchild = q;     //建立前驱结点后继线索 pre->rtag = 1;}pre = q;
}
//中序线索化二叉树
void  CreateInThread(ThreadTree T){pre = NULL;if(T!=NULL){      //非空二叉树才能线索化 InThread(T);  //中序线索化二叉树 if(pre->rchild==NULL)pre->rtag = 1;    //处理遍历的最后一个结点 }
} 

线索二叉树 —C语言王道相关推荐

  1. 线索二叉树 C语言 数据结构 先序线索二叉树 中序线索二叉树 后序线索二叉树

    在二叉树的结点上加上线索的二叉树称为线索二叉树,对二叉树以某种遍历方式(如先序.中序.后序或层次等)进行遍历,使其变为线索二叉树的过程称为对二叉树进行线索化. 文章目录 一.c语言实现先序线索.中序线 ...

  2. 线索二叉树(C语言详解----画图理解)

    揽 1. 前序 2.定义数据结构 3.线索二叉树的规律 3.1 图示 4.手算线索过程 5.问题以及改进 6.查找前驱和后继算法 7.代码 7.1建立二叉树 7.2 中序线索 7.4 前驱查找 7.5 ...

  3. 线索二叉树-C语言实现

    线索二叉树的定义 在二叉链表中, 具有 n 个结点的二叉链表有 n + 1 个空指针域. 由此, 可以利用这些空指针域来存放结点的直接前驱和直接后继的信息 结点的存储结构 lchild ltag da ...

  4. 数据结构_线索二叉树(C语言)

    数据结构总目录 线索二叉树 1. 结构解析 线索二叉树,是对链式二叉树中的空指针的再次利用,在一般的链式二叉树中,叶子结点都存在左右空指针,所以为了不浪费这些空指针,于是就有了线索二叉树. 线索二叉树 ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. iOS 自定义转场动画初探
  2. Windows Mobile与OPhone开发对比
  3. 设计模式之建造者模式(01)
  4. AMD:“全民四核”大作战
  5. shrio的rememberMe不起作用
  6. C#判断某软件是否安装
  7. The repository does not have a Release
  8. 容器编排技术 -- Kubernetes kubectl edit 命令详解
  9. 移动端点击拉起输入_耐用的筛分式移动破碎站
  10. 【Mac】setremotelogin: Turning Remote Login on or off requires Full Disk Access privileges.
  11. juniper srx电话单通
  12. 【交通标志识别】基于matlab GUI矩匹配算法路标识别【含Matlab源码 1175期】
  13. js返回上一页并刷新、返回上一页、自动刷新页面
  14. 选股小技巧|如何选股
  15. python爬虫教程下载-Python网络爬虫从入门到精通 PDF 下载
  16. 5款宝藏浏览器插件推荐,每一个都真香,一定要看到最后
  17. CentOS 7静态IP在主机重启后失效解决
  18. path development介绍
  19. .XXX文件的文件类型变成WanNengZip.XXX应该如何打开(阻止流氓软件万能压缩、好压、快压等挟持正常软件)
  20. Pr 入门系列之四:编辑(基础篇)

热门文章

  1. 苹果悬浮球_今天才发现!iPhone手机悬浮球这么好用!怪自己知道太晚了
  2. 2019.5.24 自学前端 120天
  3. UEFI模式下WIN10+Ubuntu18.04LTS(挂载到固态加机械)双系统安装
  4. 【MySQL基础教程】DQL语句详细介绍
  5. 网页字体 服务器上,网页字体云服务器
  6. 双十一值得入手的运动耳机推荐,2022年好用排行榜运动耳机推荐
  7. 判断文件上传时文件的类型
  8. Python学习笔记之扑克牌比大小
  9. 一加7pro电脑模式_谈谈一加7 Pro的几个小功能 虽然简单但很实用
  10. (附源码)springboot校园新闻网站的设计与实现 毕业设计142357