树与二叉树【中】

news2024/11/15 12:12:58

目录

  • 二. 二叉树
    • 2.1 二叉树的性质
    • 2.2 二叉树的存储结构
      • 2.2.1 二叉树的顺序存储(只适合存储完全二叉树)
      • 2.2.2 二叉树的链式存储
    • 2.3 二叉树的遍历
      • 2.3.1 先序遍历
      • 2.3.2 中序遍历
      • 2.3.3 后序遍历
      • 2.3.4 二叉树的层序遍历
      • 2.3.5 由遍历序列构造二叉树
        • 2.3.5.1 前序+中序确定二叉树
        • 2.3.5.2 后序+中序确定二叉树
        • 2.3.5.3 层序+中序确定二叉树
    • 2.4 线索二叉树(难且重要)
      • 2.4.1 线索二叉树的概念
      • 2.4.2 二叉树的线索化(代码实现)
      • 2.4.3 在线索二叉树中找前驱/后继

\quad

二. 二叉树

\quad

2.1 二叉树的性质

\quad

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

在这里插入图片描述

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

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

\quad

2.2 二叉树的存储结构

\quad

2.2.1 二叉树的顺序存储(只适合存储完全二叉树)

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

在这里插入图片描述

\quad

2.2.2 二叉树的链式存储

\quad

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

在这里插入图片描述

\quad

2.3 二叉树的遍历

\quad

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

2.3.1 先序遍历

\quad

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

在这里插入图片描述

\quad

2.3.2 中序遍历

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

2.3.3 后序遍历

\quad

在这里插入图片描述

\quad

2.3.4 二叉树的层序遍历

\quad

在这里插入图片描述
B出来后,他的左右孩子就要入队

在这里插入图片描述

\quad

2.3.5 由遍历序列构造二叉树

\quad

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

在这里插入图片描述

在这里插入图片描述

\quad

2.3.5.1 前序+中序确定二叉树

\quad

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

\quad

2.3.5.2 后序+中序确定二叉树

\quad
在这里插入图片描述

\quad

2.3.5.3 层序+中序确定二叉树

\quad

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
\quad

2.4 线索二叉树(难且重要)

2.4.1 线索二叉树的概念

\quad
普通二叉树存在的问题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
\quad

以中序为例构建线索二叉树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意这里的名词含义

在这里插入图片描述

\quad

2.4.2 二叉树的线索化(代码实现)

\quad

中序线索化

在这里插入图片描述

在这里插入图片描述

先序线索化出现的问题

在这里插入图片描述
假设现在访问的是第三个结点也就是D结点,那么pre就是指向B
在这里插入图片描述
按照visit的逻辑,D的做孩子指向B,然后pre在指向D
根据先序规则,访问完根节点接着就是访问左孩子
就会导致q结点指回B,这样就会形成一个闭环了

那么怎么解决这个问题呢
我们对preThread进行改造一下
在这里插入图片描述
由于visit中,我们访问完左孩子后会把Ltag置为1,表示已经指向前驱了

那么我们就可以对Ltag动手
在这里插入图片描述
改造完成

在这里插入图片描述

后序线索化(不会出现先序线索化的那个问题)

在这里插入图片描述

//二叉树的遍历

#include<stdio.h>
#include<stdlib.h>
#include<String.h>
#include<assert.h>


typedef char BTDatetype;

typedef struct BinaryTreeNode {
	BTDatetype _date;
	struct BinaryTreeNode* _right;
	struct BinaryTreeNode* _left;
	int ltag, rtag;  //等于0就是指向孩子, 等于1就是指向前驱或后继
}BTNode;




BTNode* p;             //p指向目标节点
BTNode* pre = NULL;    //指向目标节点的前驱
BTNode* final = NULL;   //用于记录最终结果


void visit(BTNode* goal);
void PrevOrder(BTNode* root);
void InThread(BTNode* root);
void InOrder(BTNode* root);
BTNode* CreateNode(char x);
void PostOrder(BTNode* root);
void CreateInThread(BTNode* T); //中序线索化二叉树
void PreThread(BTNode* root);//先序遍历二叉树, 一边遍历,一边线索化


//前序遍历
void PrevOrder(BTNode* root)
{
	if (root == NULL)
	{
		//printf("NULL");
		return;
	}
	printf("%c ", root->_date);
	PrevOrder(root->_left);
	PrevOrder(root->_right);
}



//中序遍历
void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		//printf("NULL ");
		return;
	}
	InOrder(root->_left);
	printf("%c ", root->_date);
	InOrder(root->_right);
}



//后序遍历
void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		//printf("NULL ");
		return;
	}
	PostOrder(root->_left);
	PostOrder(root->_right);
	printf("%c ", root->_date);
}



//模拟树 
BTNode* CreateNode(char x)
{
	BTNode* Node = (BTNode*)malloc(sizeof(BTNode));
	Node->_date = x;
	Node->_left = NULL;
	Node->_right = NULL;
	Node->ltag = 0;
	Node->rtag = 0;

	return Node;
}



//线索化
void visit(BTNode* root) {
	if (root->_left == NULL)
	{
		root->_left = pre;
		root->ltag = 1;
	}
	if (pre != NULL && pre->_right ==NULL)
	{
		pre->_right = root;
		pre->rtag = 1;
	}
	pre = root;
}

//中序遍历二叉树, 一边遍历,一边线索化
void InThread(BTNode* root)
{
	if (root == NULL)
	{
		//printf("NULL ");
		return;
	}
	InThread(root->_left);
	visit(root);
	InThread(root->_right);
}


//先序遍历二叉树, 一边遍历,一边线索化
void PreThread(BTNode* root)
{
	if (root == NULL)
	{
		//printf("NULL ");
		return;
	}
	visit(root);
	if (root->ltag == 0)
	{
		PreThread(root->_left);
	}
	PreThread(root->_right);
}



void CreateInThread(BTNode* T) //中序线索化二叉树
{
	pre = NULL;
	if (T != NULL) {
		InThread(T);
		if (pre->_right == NULL) {
			pre->rtag = 1;
		}
	}

}



int main()
{
	BTNode* A = CreateNode('A');
	BTNode* B = CreateNode('B');
	BTNode* C = CreateNode('C');
	BTNode* D = CreateNode('D');
	BTNode* E = CreateNode('E');
	BTNode* F = CreateNode('F');
	BTNode* G = CreateNode('G');

	A->_left = B;
	A->_right = C;
	B->_left = D;
	B->_right = E;
	C->_left = F;
	D->_right = G;






	return 0;
}


\quad

2.4.3 在线索二叉树中找前驱/后继

\quad

在这里插入图片描述
根据中序遍历的规则,如有一直有左孩子,那么就会最先访问最左下的节点

在这里插入图片描述

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

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

相关文章

【HarmonyOS】HarmonyOS NEXT学习日记:八、组件通信

【HarmonyOS】HarmonyOS NEXT学习日记&#xff1a;八、组件通信 通过前面的学习我们基本上掌握了如何封装组件&#xff0c;但是实际使用过程中组件之间的状态需要互相之间关联通讯&#xff0c;涉及到父子组件&#xff0c;后代组件之间的相互通信。 State装饰器&#xff1a;组…

Loader QML Type

文章目录 Loader QML Type描述属性&#xff08;Properties&#xff09;active : boolasynchronous : bool&#xff08;异步&#xff09;item : objectprogress : realsource : urlsourceComponent : Componentstatus : enumeration 信号&#xff08;Signal Documentation&#…

四,搭建环境:表述层

四&#xff0c;搭建环境&#xff1a;表述层 文章目录 四&#xff0c;搭建环境&#xff1a;表述层设定 Web 工程web.xml 的配置编写配置 ContextLoaderListener配置 DispatcherServlet配置 CharacterEncodingFilter配置 HiddenHttpMethodFilter 配置 Spring MVC配置视图解析相关…

【JKI SMO】框架讲解(九)

本节内容将演示如何向SMO框架添加启动画面。 1.打开LabVIEW新建一个空白项目&#xff0c;并保存。 2.找到工具&#xff0c;打开SMO Editor。 3.新建一个SMO&#xff0c;选择SMO.UI.Splash。 4. 打开LabVIEW项目&#xff0c;可以看到项目里多了一个SystemSplash类。 打开Process…

c++11-lambda表达式,包装器function,bind

lambda表达式 lambda表达式在很多语言都是有的&#xff0c;c当然是有的&#xff0c;但是像C语言就没有这个。和很多语言相同c的lambda表达式都是为了简化代码&#xff0c;当我们需要传函数的时候我们就可以用lambda表达式写一个匿名函数。 书写格式&#xff1a; [capture-li…

【Log4j2】代码执行漏洞复现!

执行以下命令 启动命令 systemctl start dockercd vulhub/log4j/CVE-2021-44228docker-compose up -d # 访问网址 http://192.168.3.42&#xff1a;xxxx/solr/#/ 启动靶场环境并在浏览器访问!!! 先在自己搭建的DNSLOG平台上获取一个域名来监控我们注入的效果. 可以发现 /solr…

人工智能:所有144本SCI期刊都在这里(20本Top,4本On Hold)

本周投稿推荐 SCI&EI • 4区“水刊”&#xff0c;纯正刊&#xff08;来稿即录&#xff09; • CCF-B类&#xff0c;IEEE一区-Top&#xff08;3天初审&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09; 知网&#xff08;CNKI&#xff09;、谷歌学术 …

CS61C | lecture5

CS61C | lecture5 浮点数的表示 用一个小数点作为边界分隔整数部分和小数部分。 10.101 0 2 1 2 1 1 2 − 1 1 2 − 3 2.62 5 10 10.1010_{2}1\times2^11\times2^{-1}1\times2^{-3}2.625_{10} 10.10102​12112−112−32.62510​ Scientific Notation(Binary) 单精度…

.JPG图片,各种压缩率下的文件尺寸

测试结果 不改变图片幅面的情况下&#xff0c;cv2 jpg压缩算法&#xff1a; 默认quality是9550时&#xff0c;相应的图片尺寸是95的1/3 可用。25时&#xff0c;图片尺寸是1/4&#xff0c;仍可用。 2024/07/31 16:31 85,305 out_10.jpg 2024/07/31 16:31 …

不要怕,手把手带你做好小程序关键词优化

要想让小程序在众多同类中脱颖而出&#xff0c;吸引更多的用户&#xff0c;就必须进行有效的关键词优化。优化小程序关键词是提升小程序搜索排名和吸引目标用户的重要手段。以下是一些优化小程序关键词的具体步骤和策略&#xff1a; 一、关键词研究与选择 1.了解用户搜索习惯…

文件解析漏洞

IIS解析漏洞 在windows Server 2003安装iis 1.IIS6.X 1.1 目录解析 在网站下建立文件夹的名字为 .asp/.asa 的文件夹&#xff0c;其目录内的任何扩展名的文件都被IIS当作asp文件来解析并执行。 先创建一个1.asp文件夹 再创建一个1.txt 里面写 <%now()%> 2.1 畸形文件…

go test单元测试

go test Go语言中的测试依赖go test命令。 go test 命令是用来运行测试代码的工具。测试代码通常与要测试的代码放在同一个包中&#xff0c;并且测试文件通常以 _test.go 结尾。 go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内&#xff0c;所有以_tes…

中国星坤拨码开关系列:为电子设备控制的提供可靠连接

在电子设备日益复杂的今天&#xff0c;控制和设置的简便性成为了用户体验的关键。中国星坤推出的拨码开关以其直观的操作界面和高可靠性&#xff0c;正在引领电子设备控制的新纪元。本文将深入探讨星坤拨码开关的主要特性、应用场景及其在现代电子设备中的重要性。 直观的人机界…

连接器表面缺陷检测方案

连接器是一种用于连接电子设备或电路中不同部件之间的组件&#xff0c;通常用于传输电力、信号或数据。连接器的设计和类型各不相同&#xff0c;以适应不同设备和应用的需求。连接器用于连接电子设备之间的电线、电缆或电路板&#xff0c;实现信号传输和电力供应。连接器设计应…

教育杂志教育杂志社教育编辑部2024年第18期目录

卷首语 “浙”里启程&#xff0c;一路“黔”行 张国军; 1 特别关注 普通高中高质量发展的九大要素——以江苏省通州湾中学为例 徐新民; 4-9 专题策划 “四史”教育融入初中历史教育教学活动探索 陈清波; 10-12 新时代加强师德师风建设的实践与认识 吴东林; 13-…

免费获取Windows7专业版ISO镜像!附上详细安装教程

Windows7专业版系统相比家庭版功能更加完善和强大&#xff0c;支持加强的网络功能、高级备份功能、位置感知打印、加密文件系统等多项安全功能&#xff0c;还有Windows XP模式、脱机文件夹和移动中心等便捷功能&#xff0c;特别适合技术爱好者和中小企业用户安装使用。以下系统…

python之贪吃蛇

废话不多说&#xff0c;直接上代码&#xff08;确保已经安装 pygame&#xff09; import pygame import random# 基础设置 # 屏幕高度 SCREEN_HEIGHT 480 # 屏幕宽度 SCREEN_WIDTH 600 # 小方格大小 GRID_SIZE 20# 颜色设置 WHITE (255, 255, 255) BLACK (0, 0, 0) GREEN…

关于 Postman 这些你都知道吗?

Postman是接口测试工具&#xff0c;在做接口测试的时候&#xff0c;Postman相当于一个客户端&#xff0c;它可以模拟用户发起的各种http请求&#xff0c;将请求的数据发送到服务端&#xff0c;获取对应的结果&#xff0c;从而测试接口是否能够满足业务功能要求&#xff0c;很直…

# mongodb副本集,执行 rs.addArb(“172.18.30.110:27019“) 添加仲裁节点,客户端卡住,半天没有反应,解决方法

mongodb副本集&#xff0c;执行 rs.addArb(“172.18.30.110:27019”) 或者rs.add(“172.18.30.110:27019”, true) 添加仲裁节点&#xff0c;客户端卡住&#xff0c;半天没有反应&#xff0c;解决方法 1、可以退出主节点后&#xff0c;重新登录&#xff0c; # Ctrl C 或者&a…