C++实现链式存储线索二叉树

一颗线索二叉树:

在这里插入图片描述

根据下图进行节点的创建:
在这里插入图片描述
代码如下:

#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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/311682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows 仍在设置此设备的类配置。 (代码 56)_谷歌发布Flutter Alpha:支持Windows

老孟导读&#xff1a;Windows来了&#xff0c;Mac、Linux、Web还远吗&#xff1f; 本文翻译自https://medium.com/flutter/announcing-flutter-windows-alpha-33982cd0f433 我们的使命是为开发人员提供一个开源&#xff0c;高生产率的框架&#xff0c;以便在任何平台上构建漂亮…

word List39

word List39 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

不同路径 II-dp

题目背景 一个机器人位于一个 n x m 网格的左上角 机器人每次只能向下或者向右移动一步。它试图达到网格的右下角 题目描述 现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径&#xff1f; 网格中的障碍物和空位置分别用 1 和 0 来表示。 输入格式 第一行两…

.NET Core开发实战(第5课:依赖注入:良好架构的起点)--学习笔记(下)

05 | 依赖注入&#xff1a;良好架构的起点注册完毕之后&#xff0c;想替换某些组件的某些部分时&#xff0c;可以使用 Replace 和 RemoveAllservices.AddSingleton<IOrderService>(new OrderService()); services.Replace(ServiceDescriptor.Singleton<IOrderService,…

python正态分布函数_python3-正态分布

loc 平均值 scale (scale) 标准差 pdf(x, loc0, scale1) 正态分布&#xff08;Normal distribution&#xff09;&#xff0c;也称“常态分布”&#xff0c;又名高斯分布&#xff08;Gaussian distribution&#xff09;&#xff0c;最早由A.棣莫弗在求二项分布的渐近公式中得到。…

word List40

word List40 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

int 范围_Java学习之随机生成5个(范围1——33)不同数字的思考

昨天做了一道福彩双色球的简单程序题&#xff0c;一开始不懂双色球的玩法&#xff0c;楼主我从来不买彩票的&#xff0c;( ╯□╰ )。所以随机生成某个范围的5个数字&#xff08;数字可以重复&#xff09;&#xff0c;那么很简单&#xff0c;一个循环就可以搞定了&#xff0c;但…

高级数据结构---优先队列

高级数据结构—优先队列 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include <stdio.h> #include <stdlib.h> int r[] { -1,1,4,590,4,2,8,7,5,89,67,5,2,1,67,86,54 };//存储要排序的数,第一个元素不存储元素赋值为-1 int length sizeof(r) / size…

[蓝桥杯2017初赛]贪吃蛇长度-模拟(水题)

题目描述 小明在爷爷的私人收藏馆里找到一台老式电脑。居然没有图形界面&#xff0c;只能用控制台编程。 经过小明的一阵摸索&#xff0c;神奇地设计出了控制台上的贪食蛇游戏。 如下图&#xff0c;是游戏时画面截图。 其中&#xff0c;H表示蛇头&#xff0c;T表示蛇尾。#表示…

蓝屏(BSOD)转储设置,看本文就够了!

前言 我们在内核转储&#xff0c;开抓啦&#xff01;这篇文章里介绍了一个关键的系统设置。设置好后可以让系统在蓝屏&#xff08;Blue Screen of Death&#xff0c;简称 BSOD&#xff09;的时候自动保存转储文件。当时只是简单的介绍了设置步骤&#xff0c;本文力求详细的介绍…

算法---字符串顺序平移

算法—字符串顺序平移 原理&#xff1a;矩阵的转置思想 代码&#xff1a; #include <stdio.h> #include <stdlib.h> void swap(char *a,int i, int j) {//交换二个变量的值char temp a[i];a[i] a[j];a[j] temp; } void invert(char *a,int s, int e) {//对称…

delphi中的函数传参如何传枚举参数_Python基础笔记Day05函数

Python函数 function函数是组织好的&#xff0c;可重复使用的&#xff0c;用来实现单一&#xff0c;或相关联功能的代码段。函数能提高应用的模块性&#xff0c;和代码的重复利用率。Python提供了许多内建函数&#xff0c;比如print()。但你也可以自己创建函数&#xff0c;这被…

[蓝桥杯2018初赛]日志统计-双指针

代码如下&#xff1a; #include <iostream> #include <algorithm> using namespace std; typedef pair<int, int>PII; #define x first #define y second const int N 100010; bool st[N]; int n, d, k; PII a[N]; int cnt[N];int main() {cin >> n …

不要错过这轮疫情的“洗牌”机会

大家好&#xff0c;我是Z哥。今天和大家随便聊聊天。这次的疫情对我们所有人影响都很大&#xff0c;除了让你心怀忐忑的过了个春节之外&#xff0c;呆在家的时间对很多人来说也是格外的长。这样的突发事件&#xff0c;除了能看出不同公司之间应对突发状况的能力差异之外&#x…

算法---查找倒数第k个链表的值

算法—查找倒数第k个链表的值 代码&#xff1a; link.h #pragma once #define elemType int #include<stdlib.h> typedef struct link {elemType data;struct link * next; }link; bool initLink(link* &Link) {//初始化链表Link (link*)malloc(sizeof(link));Li…

mysql boolean_产品操作MySQL第7篇 – 运算符 – IS NULL

本资料为产品岗位作为日常工作参考&#xff0c;语言口语化At 2019/4/27 By David.Yang介绍什么是IS NULL IS NULL作为一种运算符&#xff0c;用来对数据表中的NULL值数据进行过滤。语法target IS NULLtarget值为NULL&#xff0c;则表达式返回TRUE&#xff0c;否则返回FALSE。MY…

微软开源Scalar,提升操作巨型Git仓库的速度

Git 属于分布式版本控制系统&#xff0c;默认情况下&#xff0c;每个 Git 仓库都具有整个历史记录的完整文件副本。即便是中等规模的开发团队也会产生数千个提交&#xff0c;每个月向仓库添加几百兆的数据。而随着仓库的占用空间增加&#xff0c;Git 难以管理所有数据&#xff…

word List 41

word List41 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

b树与b+树的区别_面试必考:B树、B树、B+树、B*树图文详解

B树B树又叫做二叉搜索树&#xff0c;倒状的树形结构。如下图所示特点&#xff1a;所有的非子夜节点最多拥有两个子节点树(左子树和右子树)。所有结点存储一个关键字。节点的左右儿子&#xff0c;左边是比该节点小的&#xff0c;右边是比该节点大的。缺点&#xff1a;因为二叉搜…

[蓝桥杯2016初赛]煤球数目-找规律

题目描述 有一堆煤球&#xff0c;堆成三角棱锥形。具体&#xff1a; 第一层放1个&#xff0c; 第二层3个&#xff08;排列成三角形&#xff09;&#xff0c; 第三层6个&#xff08;排列成三角形&#xff09;&#xff0c; 第四层10个&#xff08;排列成三角形&#xff09;&…