一颗线索二叉树:

根据下图进行节点的创建:

代码如下:

#include <iostream>
using namespace std;
typedef char ElemType;typedef struct BiThrNode
{ElemType data;int ltag,rtag;struct BiThrNode *lchild,*rchild;
}BiThrNode,*BiThrTree;


因为普通二叉树有空指针域,所以我们可以利用这些空指针来线索化

1、二叉树的线索化,实质上就是遍历一棵二叉树,在遍历过程中,访问节点的操作是检查当前结点的左右指针域是否为空,如果为空,即将他们改为前驱节点或后继节点的线索。为记录前驱节点,定义pre为全局变量,始终指向当前结点的前驱节点。

定义一个全局变量指向线索二叉树的前驱节点:

BiThrNode *pre;

中序遍历进行线索化:

void InThreading(BiThrTree p)
{if (p){InThreading(p->lchild);if (!p->lchild){p->ltag = 1;p->lchild = pre;}if (!pre->rchild){pre->rtag = 1;pre->rchild = p;}pre = p;InThreading(p->rchild);}
}

根据下图建立头结点,线索化:


代码如下:

bool InOrderThr(BiThrNode *head,BiThrTree T)
{head = new BiThrNode;if (head==NULL)return false;head->ltag = 0;head->rtag = 1;head->rchild = head;if (!T){head->lchild = head;}else{head->lchild = T;pre = head;InThreading(T);pre->rchild = head;pre->rtag = 1;head->rchild = pre;}return true;
}

对于中序线索二叉树上的任意节点,寻找其中序的前驱节点,有以下两种情况:
1、如果该节点的左标志域为1,那么其左指针所指向的节点便是它的前驱节点。
2、如果该节点的左标志为0,表明该节点有左孩子,根据中序遍历的定义,它的前驱节点是以该节点的左孩子为根节点的子树的最右节点,即沿着其左子树的右指针链向下查找,当某节点的右标志域为1时,它就是所要找的前驱节点。

在中序线索二叉树上查找任意节点的中序前驱节点:

BiThrNode *InPreNode(BiThrNode *p)
{BiThrNode *pre;pre = p->lchild;if (p->ltag!=1){while(pre->rtag == 0){pre = pre->rchild;}}return pre;
}

对于中序线索二叉树上的任意节点,寻找其中序的后继节点,有以下两种情况:
1、如果该节点的右标志域为1,那么其右指针所指向的节点便是它的后继节点。
2、如果该节点的右标志为0,表明该节点有右孩子,根据中序遍历的定义,它的后继节点是以该节点的右孩子为根节点的子树的最左节点,即沿着其右子树的左指针链向下查找,当某节点的左标志域为1时,它就是所要找的后继节点。

在中序线索二叉树上查找任意节点的中序后继节点:

BiThrNode *InpostNode(BiThrNode *p)
{BiThrNode *post;post = p->rchild;if (p->rtag!=1){while(post->ltag==0){post = post->lchild;}}return post;
}

从最后一个节点根据前驱节点进行线索二叉树的遍历:

void InOrderPre(BiThrNode *head)
{BiThrNode *p;p = head->rchild;//指向最后一个节点while(p != NULL && p!=head){cout<<p->data;p = InPreNode(p);}
}

从第一个节点根据后继节点进行线索二叉树的遍历:

void InOrderPost(BiThrNode *head) {BiThrNode *p;p = head->lchild;while (p->ltag != 1) {p = p->lchild;}while (p != NULL && p != head) {cout << p->data;p = InPostNode(p);}
}

完整代码如下:

#include <iostream>
using namespace std;
typedef char ElemType;typedef struct BiThrNode {//节点的创建ElemType data;int ltag, rtag;struct BiThrNode *lchild, *rchild;
} BiThrNode, *BiThrTree;BiThrNode *pre;//定义一个全局变量指向线索二叉树的前驱节点void InThreading(BiThrTree &p) {if (p) {InThreading(p->lchild);if (!p->lchild) {p->ltag = 1;p->lchild = pre;}if (!pre->rchild) {pre->rtag = 1;pre->rchild = p;}pre = p;InThreading(p->rchild);}
}bool InOrderThr(BiThrTree &head, BiThrTree T) {head = new BiThrNode;if (head == NULL)return false;head->ltag = 0;head->rtag = 1;head->rchild = head;if (!T) {head->lchild = head;} else {head->lchild = T;pre = head;InThreading(T);pre->rchild = head;pre->rtag = 1;head->rchild = pre;}return true;
}BiThrNode *InPreNode(BiThrNode *p) {BiThrNode *pre;pre = p->lchild;if (p->ltag != 1) {while (pre->rtag == 0) {pre = pre->rchild;}}return pre;
}BiThrNode *InPostNode(BiThrNode *p) {BiThrNode *post;post = p->rchild;if (p->rtag != 1) {while (post->ltag == 0) {post = post->lchild;}}return post;
}void InOrderPre(BiThrNode *head) {BiThrNode *p;p = head->rchild;//指向最后一个节点while (p != NULL && p != head) {cout << p->data;p = InPreNode(p);}
}void InOrderPost(BiThrNode *head) {BiThrNode *p;p = head->lchild;while (p->ltag != 1) {p = p->lchild;}while (p != NULL && p != head) {cout << p->data;p = InPostNode(p);}
}void CreateBiTree(BiThrTree &T) {//以先序遍历的方式创建二叉树char ch;cin >> ch;if (ch == '#')T = NULL;else {T = new BiThrNode;T->data = ch;T->ltag = 0;T->rtag = 0;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}
}int main() {BiThrTree T;BiThrNode *head;CreateBiTree(T);//以先序遍历输入if (InOrderThr(head, T))cout << "线索化完成" << endl;elsecout << "线索化失败" << endl;cout<<"逆序输出中序遍历: ";InOrderPre(head);//逆序输出中序遍历cout << endl;cout<<"正序输出中序遍历: ";InOrderPost(head);//正序输出中序遍历return 0;
}

测试效果图:

测试结果:

本文参考文章地址:
https://blog.csdn.net/g15827636417/article/details/52967949

C++实现链式存储线索二叉树相关推荐

  1. 【Java数据结构】链式存储的二叉树

    链式存储的二叉树 二叉树数据结构 创建二叉树 二叉树的遍历 先序遍历 中序遍历 后序遍历 二叉树节点的查找 先序查找 中序查找 后序查找 删除二叉树的子树 二叉树示例完整代码 BinaryTree 类 ...

  2. java链式存储_Java实现链式存储的二叉树

    importjava.util.LinkedList;importjava.util.List;importjava.util.Queue;importjava.util.Stack;/***@aut ...

  3. Java实现链式存储的二叉树节点的定义

    public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.va ...

  4. c语言二叉树链式存储,C语言 二叉树的链式存储实例

    二叉树的链式存储 实现二叉树的基本操作:建立.遍历.计算深度.结点数.叶子数等. 输入C,先序创建二叉树,#表示空节点: 输入H:计算二叉树的高度: 输入L:计算二叉树的叶子个数: 输入N:计算二叉树 ...

  5. 数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序、中序、后序、层次)和线索二叉树

    二叉树每个节点至多只有两棵子树(即二叉树中不存在度大于2的节点),并且二叉树的子树有左右之分,其次序不能任意颠倒. 1. 二叉树 二叉树一般采用链式存储结构,用链表节点来存储二叉树中每个节点.在二叉树 ...

  6. 二叉树的链式存储结构(线索二叉树)

    一.链式存储结构 由于顺序存储二叉树的空间利用率较低,因此二叉树一般都采用链式存储结构,用链表结点来存储二叉树中的每个结点.在二叉树中,结点结构通过包括若干数据域和若干指针域,二叉链表至少包含3个域: ...

  7. 数据结构与算法(6-2)二叉树的存储结构(顺序存储、链式存储)

    目录 一.二叉树的顺序存储 存储方式 总代码 二.二叉树的链式存储(二叉链表) 1.存储结构 2.创建二叉树 总代码 一.二叉树的顺序存储 存储方式 //树的顺序存储 typedef struct { ...

  8. 二叉树的链式存储结构--二叉链表

    1 二叉树的链式存储结构 //二叉链表的结点结构定义typedef int TElemType; typedef struct BiTNode {TElemType data;struct BiTNo ...

  9. C语言手写二叉树(链式存储结构)

    C语言手写二叉树(链式存储结构) 二叉树结构 二叉树基本运算 代码 图例(main函数执行过程如下:) 阶段I 阶段II 阶段III 阶段IV 阶段V 先序遍历输出过程 二叉树结构 二叉树可以用顺序存 ...

最新文章

  1. GAN 的发展对于研究通用人工智能有什么意义?
  2. 音乐产业碰撞人工智能,这次擦出了怎样的新火花?
  3. get与post请求问题
  4. 怎么才能学好ajax,ajax - 如何学好java - BlogJava
  5. java——HashMap的实现原理,自己实现简单的HashMap
  6. poj2632 累死了
  7. pythonxml模块高级用法_Python利用ElementTree模块处理XML的方法详解
  8. css通配选择符用什么表示,css3选择符使用个人理解。
  9. [转载] Python之使用K-Means算法聚类消费行为特征数据分析(异常点检测)
  10. linux ulipad,如何在windows下安装配置python工具Ulipad
  11. 在linux中安装pdf,linux 中安装PDF阅读器FoxitReader
  12. Python—字典的操作
  13. kali使用外接usb蓝牙
  14. ELK日志分析系统搭建以及springboot日志发送到ELK中
  15. Conflicted Confucians
  16. swagger easyExcel导出Excel文件打不开,文件损坏
  17. 卡波姆对皮肤的作用副作用_【 卡波姆的副作用】_影响_坏处-大众养生网
  18. 红外对管应该如何选择比较好
  19. 量子态操作:基于门的三态旋转
  20. 美团如何“折叠时间”?

热门文章

  1. Android之ActivityManager与Proxy模式的运用
  2. spring之使用Spring Security实现权限管理
  3. pythonweb服务器怎么让别人访问_Django配置让其他电脑访问网站
  4. 找不到libmmd.dll无法继续执行代码_300 行代码带你秒懂 Java 多线程!| 原力计划...
  5. linux下网口监控软件_超赞的!Aibaba技术官分享高性能Linux服务器解读笔记
  6. 神PS!老爸把儿子的画作P成现实,看完我笑哭了
  7. 套套原来是这样装袋的,40个机械动图看懂好像并不容易。。。
  8. 复工后,看看他们都是怎么上班的!
  9. 这个被称为20世纪最伟大人物的最强理科生,到底有多强,你根本不了解
  10. java ftp 判断目录存在_java判断ftp目录是否存在的方法