数据结构——线索化二叉树和哈夫曼树[通俗易懂]

数据结构——线索化二叉树和哈夫曼树[通俗易懂]线索化二叉树和哈夫曼树基础知识介绍与代码分析一、基础知识介绍二、代码分析:线索二叉树(采用中序遍历)#include “pch.h”#include <iostream>using namespace std;//定义线索二叉树typedef struct Tree{ int data, LTag, RTag; //定义数据域与标记域 Tre…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

线索化二叉树和哈夫曼树基础知识介绍与代码分析

一、基础知识介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、代码分析:

线索二叉树(采用中序遍历)

#include "pch.h"
#include <iostream>
using namespace std;

//定义线索二叉树
typedef struct Tree
{ 
   
	int data, LTag, RTag;	//定义数据域与标记域
	Tree *lchild, *rchild;

}Tree,*Trees;

Trees pre = NULL;	//设置前驱线索

//初始化二叉树
void InitBitTree(Trees*boot)
{ 
   
	*boot = (Trees)malloc(sizeof(Tree));
	(*boot)->lchild = (*boot)->rchild = NULL;
	(*boot)->LTag = (*boot)->RTag = 0;
}
//创建二叉树
void CreateBtTree(Trees &boot)
{ 
   
	int num;
	cout << "请输入数据:";
	cin >> num;
	if (num==0)
	{ 
   
		boot = NULL;
	}
	else
	{ 
   
		boot =(Trees) malloc(sizeof(Tree));
		boot->data = num;
		boot->lchild = boot->rchild = 0;
		boot->LTag = boot->RTag = 0;
		CreateBtTree(boot->lchild);
		CreateBtTree(boot->rchild);
	}
}
//添加线索
void InssertLineTree(Trees &boot)
{ 
   
	if (boot!=NULL)
	{ 
   
		InssertLineTree(boot->lchild);//线索化左子树
		if (boot->lchild==NULL)
		{ 
   
			boot->LTag = 1;
			boot->lchild = pre;//设置前驱线索
		}
		if (pre!=NULL&&pre->rchild==NULL)
		{ 
   
			pre->rchild = boot ;
			pre->RTag = 1;
		}
		//当前访问节点为下一个节点的前驱/
		pre = boot;
		//线索化右子树
		InssertLineTree(boot->rchild);
	}
}
//创建头结点
Trees InOrderThread(Trees &rt)
{ 
   
	Trees throot;
	if (!(throot = (Trees)malloc(sizeof(Tree))))
	{ 
   
		cout << "头结点创建失败!" << endl;
		exit(0);
	}
	throot->LTag = 0;//左标记为0 指向左子树
	throot->RTag = 1;//右标记为1 指向遍历的前驱
	throot->rchild = throot;//右子树指向头结点本身
	if (!throot)
	{ 
   
		//二叉树如果为空,左指针指向头结点本身
		throot->lchild = throot;
	}
	else
	{ 
   
		throot->lchild = rt;
		pre = throot;
		//插入线索
		InssertLineTree(rt);
		pre->rchild = throot;
		pre->RTag = 1;
		throot->rchild = pre;
	}

	return throot;
}

//中序遍历查找前驱
void InPre(Trees boot)
{ 
   
	Trees q = NULL;
	if (boot->LTag==1)
	{ 
   
		pre = boot->lchild;
	}
	else
	{ 
   
		for (q=boot->lchild; q->RTag==0;q=q->rchild )
		{ 
   
			pre=q;
		}
	}
	if (pre)
	{ 
   
		cout << "用中序遍历找到的前驱为:" << pre->data << endl;
	}
	else
	{ 
   
		cout << "用中序遍历无前驱:" << endl;
	}
}

//中序遍历后序节点
void InNext(Trees boot)
{ 
   
	Trees q = NULL;
	if (boot->RTag == 1)
	{ 
   
		pre = boot->rchild;
	}
	else
	{ 
   
		for (q = boot->rchild; q->LTag == 0; q = q->lchild)
		{ 
   
			pre = q;
		}
	}
	if (pre)
	{ 
   
		cout << "用中序遍历找到的后继为:" << pre->data << endl;
	}
	else
	{ 
   
		cout << "用中序遍历无后继:" << endl;
	}
}

//中序遍历查找线索二叉树第一个节点
Trees InFirst(Trees boot)
{ 
   
	Trees p = boot;
	if (!p)
	{ 
   
		return 0;
	}
	while (p->LTag==0)
	{ 
   
		p = p->lchild;
	}
	return p;
	//中序遍历左 根 右 二叉树左左端节
	//二叉树的最左端的节点

}

//中序遍历线索二叉树
void TinOrder(Trees &throot)
{ 
   
	Trees p;
	p = throot->lchild;
	while (p!=throot)
	{ 
   
		while (p->LTag==0)//有左子树
		{ 
   
			p = p->lchild;
		}
		cout<<p->data<<endl;
		while (p->RTag==1&&p->rchild!=throot)
		{ 
   
			p = p->rchild;
			cout << p->data << endl;
		}
		p = p->rchild;
	}
	cout << endl;
}
int main()
{ 
   
	Trees boot = NULL;
	cout << "创建线索二叉树,如果输入0结束:" << endl;
	CreateBtTree(boot);
	Trees throot;	//头结点

	throot=InOrderThread(boot);
	//进行遍历
	TinOrder(throot);

	InPre(boot);
	InNext(boot);

	Trees bt=InFirst(boot);
	cout << "中序遍历线索二叉树的第一个节点为:" << bt->data << endl;

	return 0;
}

结果为:

居中

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170981.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MySQL——事务(Transaction)详解

    MySQL——事务(Transaction)详解该博客详解MySQL中的事务一、事务定义Transaction事务:一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务就是一个最小的工作单元)一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同…

    2022年5月5日
    44
  • ‘builtin_function_or_method’ object is not subscriptable 错误

    ‘builtin_function_or_method’ object is not subscriptable 错误环境:Numpy问题:数组初始化报错错误❌:a=np.array[1,2,3,4,5,6,7,8,9,10]正确✅:a=np.array([1,2,3,4,5,6,7,8,9,10])这个问题一般是问题行内有圆括号缺失或者方括号的缺失。…

    2025年7月21日
    2
  • 2018美赛 A 题

    2018美赛 A 题2018年MCM问题A:多跳HF无线电传播背景:在高频(HF,定义为3-30mHz),无线电波可以通过离开电离层和离开地球的多次反射而行进很长距离(从地球表面上的一个点到地球表面上的另一个远点)。对于低于最大可用频率(MUF)的频率,来自地面源的HF无线电波将电离层反射回地球,在那里它们可能再次反射回到电离层,在那里它们可能再次反射回地球,等等,随着每个连续的…

    2022年6月5日
    37
  • MATLAB 处理大数据

    MATLAB 处理大数据如何处理大规模的快数据集大数据指的是创建的数据和供分析的数据的数量与速率迅速增加。此趋势的主要驱动因素是不断增加的信息数字化。采集设备的数量和类型以及其他数据生成机制无时无刻不在增加。大数据源包括来自仪表传感器、卫星和医疗图像的流数据,来自安全摄像机的视频以及派生自金融市场和零售运营的数据。上述来源的大数据集可以包含千兆字节或百万兆字节的数据,并且每天以兆字节或千兆字节的级别增长。

    2022年5月23日
    139
  • IIS中WEB服务器的日志存放到SQL Server 2005中

    IIS中WEB服务器的日志存放到SQL Server 2005中

    2022年3月12日
    37
  • 文本分类算法比较与总结

    文本分类算法比较与总结本文对常用的几种文本分类算法进行了比较与总结 主要阐述它们之间的优劣 为算法的选择提供依据 nbsp 一 Rocchio 算法 nbsp Rocchio 算法应该算是人们思考文本分类问题最先能想到的 也是最符合直觉的解决方法 基本的思路是把一个类别里的样本文档各项取个平均值 例如把所有 体育 类文档中词汇 篮球 出现的次数取个平均值 再把 裁判 取个平均值 依次做下去 就可以得到一个新的向量 形象的称之为 质心 质

    2025年7月17日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号