【数据结构】二叉树详解(1)

news2024/11/24 14:30:18

⭐️ 前言

✨ 二叉树的概念性质


⭐️ 二叉树链式结构的实现

结构定义:

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

typedef int BinaryTreeDataType;

typedef struct BinaryTreeNode {
	BinaryTreeDataType value;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BinaryTreeNode;

⭕️ 二叉树的遍历

按照规则,二叉树的遍历分为:前序/中序/后序的递归遍历。

  • 前序遍历(PreOrder Traversal):访问根节点的操作发生在遍历其左右子树之前。
    • 根 -> 左子树 -> 右子树
  • 中序遍历(InOrder Traversal):访问根节点的操作发生在遍历左右子树之间。
    • 左子树 -> 根 -> 右子树
  • 后序遍历(PostOrder Traversal):访问根节点的操作发生在遍历其左右子树之后。
    • 左子树 -> 右子树 -> 根

在这里插入图片描述


PreOrder 代码:

// 前序遍历递归 根 -> 左子树 -> 右子树
void PreOrder(BinaryTreeNode* root) {
	if (root == NULL) {
		printf("# ");
		return;
	}

	printf("%d ", root->value);
	PreOrder(root->left);
	PreOrder(root->right);
}

前序递归流程图:
在这里插入图片描述

前序递归遍历顺序为:1 2 3 # # # 4 5 # # 6 # #

InOrder 代码:

// 中序遍历递归 左子树 -> 根 -> 右子树
void InOrder(BinaryTreeNode* root) {
	if (root == NULL) {
		printf("# ");
		return;
	}

	InOrder(root->left);
	printf("%d " , root->value);
	InOrder(root->right);
}

中序递归流程图:

在这里插入图片描述

中序递归遍历顺序为:# 3 # 2 # 1 # 5 # 4 # 6 #

PostOrder 代码:

// 后序遍历递归 左子树 -> 右子树 -> 根
void PostOrder(BinaryTreeNode* root) {
	if (root == NULL) {
		printf("# ");
		return;
	}

	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d " , root->value);
}

后序递归流程图:
在这里插入图片描述
后序递归遍历顺序为:# # 3 # 2 # # 5 # # 6 4 1


注:# 代表空树

⭕️ 二叉树的其他接口

// 节点的数量
int BinaryTreeSize(BinaryTreeNode* root);
// 叶子节点的数量
int BinaryTreeLeafSize(BinaryTreeNode* root);
// 求k层节点的个数
int BinaryTreeKLevelSize(BinaryTreeNode* root , int k);
// 二叉树中查找某个元素
BinaryTreeNode* BinaryTreeFind(BinaryTreeNode* root , BinaryTreeDataType x);

BinaryTreeSize 代码:

// 节点的数量
int BinaryTreeSize(BinaryTreeNode* root) {
	if (root == NULL) {
		return 0;
	}

	return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}

BinaryTreeSize 递归流程图:
在这里插入图片描述


BinaryTreeLeafSize 代码:

// 叶子节点的数量
int BinaryTreeLeafSize(BinaryTreeNode* root) {
	if (root == NULL) {
		return 0;
	}

	if (root->left == NULL && root->right == NULL) {
		return 1;
	}

	return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}

BinaryTreeLeafSize 递归流程图:
在这里插入图片描述


BinaryTreeKLevelSize 代码:

// 求k层节点的个数
int BinaryTreeKLevelSize(BinaryTreeNode* root , int k) {
	assert(k >= 1);

	if (root == NULL) {
		return 0;
	}

	if (k == 1) {
		return 1;
	}

	return BinaryTreeKLevelSize(root->left , k - 1) + BinaryTreeKLevelSize(root->right , k - 1);
}

BinaryTreeKLevelSize 递归流程图:
在这里插入图片描述


BinaryTreeFind 代码:

// 二叉树中查找某个元素
BinaryTreeNode* BinaryTreeFind(BinaryTreeNode* root , BinaryTreeDataType x) {
	if (root == NULL) {
		return NULL;
	}

	if (root->value == x) {
		return root;
	}

	BinaryTreeNode* left = BinaryTreeFind(root->left , x);
	if (left != NULL) {
		return left;
	}

	BinaryTreeNode* right = BinaryTreeFind(root->right , x);
	if (right != NULL) {
		return right;
	}

	return NULL;
}

BinaryTreeFind 递归流程图:

在这里插入图片描述


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

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

相关文章

如何克服Leetcode做题的困境

文章目录 如何克服Leetcode做题的困境问题背景克服困境的建议实践与理论结合切忌死记硬背分析解题思路不要过早看答案迭代式学习寻求帮助坚持与耐心查漏补缺 结论 如何克服Leetcode做题的困境 问题背景 明明自觉学会了不少知识&#xff0c;可真正开始做Leetcode题目时&#x…

用WooCommerce创建一个多用户商城系统和多供应商市场

线上市场是下一波数字化商务。2020 年&#xff0c;超过60% 的线上支出是通过数字市场发生的。人们喜欢从市场上购物&#xff0c;因为它们使购物变得容易。出于同样的原因&#xff0c;企业喜欢通过它们进行销售。通过多用户商城系统和多供应商WooCommerce商城设置&#xff0c;每…

Vue3结果(Result)

可自定义设置以下属性&#xff1a; 结果的状态&#xff0c;决定图标和颜色&#xff08;status&#xff09;&#xff0c;类型&#xff1a;‘success’|‘error’|‘info’|‘warn’|‘404’|‘403’|‘500’&#xff0c;默认&#xff1a;‘info’标题文字&#xff08;title&…

【机密计算-大厂有话说】IBM

什么是机密计算? 机密计算是云计算技术中的一种,通过 CPU 飞地(enclave,飞地可以理解成与世隔绝的世外桃源)隔离处理中的数据。飞地中的内容(处理中的数据)和处理这些数据用到的技术只能被授权的程序代码访问,对于云提供商以及任何人任何事都不可见也不知道。 随着公…

C# 深入理解事件(event)机制

目录 一&#xff0c;引言 二&#xff0c;事件的定义和用法 2.1 同步事件执行 2.2 异步事件执行 2.3 等待异步事件完成 2.4 捕获异常处理中的异常 一&#xff0c;引言 都知道事件的本质是一个多播委托&#xff08;MulticastDelegate)&#xff0c;但对于事件的机制和用法…

【代码随想录 | Leetcode | 第六天】链表 | 反转链表 | 两两交换链表中的节点 | 删除链表的倒数第 N 个结点

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来反转链表、两两交换链表中的节点和删除链表的倒数第N个节点的分享✨ 目录 前言206. 反转链表24. 两两交换链表中的节点19. 删除链表的倒数第 N 个结点总结 206. 反转链表 ✨题目链接点这里 给你…

HDFS与MapResource笔记

客户端向NN请求上传文件 NN回应可以上传 请求上传块,返回DN 所以后面就比较慢 找最近的服务器进行 64K发到1节点,1节点立刻发给2节点,同时1节点自动开始落盘,这里,3个节点是同时落盘的. 因为缓存是在内存中,而持久化是将数据存到磁盘上. 副本节点选择: 1.安全:放不同机架 2.速…

QT中QTimer的循环时间与槽函数执行时间分析,以及在事件循环中触发

目录 当循环时间小于槽函数时间时&#xff1a; 当循环间隔时间大于槽函数时间时&#xff1a; 当存在两个定时器器&#xff0c;其中一个还是间隔100ms&#xff0c;另一个间隔1000ms&#xff1a; 当两个定时器的循环周期大于槽函数执行时间时 当在主程序中添加一个for循环…

13年测试老鸟总结,性能测试-并发用户数估算(超细整理)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 并发用户数&#…

nuxt3初始化项目后配置eslint+prettier

1、安装 eslint 、eslint-config-prettier、eslint-plugin-prettier、prettier arn add eslint eslint-config-prettier eslint-plugin-prettier prettier -D eslint-config-prettier&#xff1a;关闭eslint中与prettier相互冲突的规则。eslint-plugin-prettier&#xff1a;赋…

26.Java 异常

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的 要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常: 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个…

【Whisper】《OpenAI Whisper 精读【论文精读】》学习笔记

方法 Whisper在论文中表示使用单模型&#xff08;single model&#xff09;来完成多个语音任务&#xff08;multitask&#xff09;&#xff0c;李沐教授认为优点是设计上比较干净&#xff1b; I. 关于单模型效果的疑问 但是他同时也提出了两个疑问&#xff1a; 使用单模型会…

Simulink仿真模块 - Data Store Read

Data Store Write:向数据存储中写入数据 库:Simulink / Signal Routing 模型为: 说明 Data Store Write 模块将其输入端口的值复制到指定的数据存储中。Data Store Write 模块执行的每个写入操作将覆盖数据存储,取代以前的内容。 此模块写入的数据存储由定义数据存储的 Dat…

刷题日记08《BFS》

概念 宽度优先搜索算法&#xff08;又称广度优先搜索&#xff09;是最简便的图的搜索算法之一&#xff0c;这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS&#xff0c;属于一种盲目搜寻…

易语言后,极语言成为官方支持语言,新中文编程语言开始革新而来

易语言促进了中文编程普及和发展 众所周知&#xff0c;吴涛先生在1997年创建的易语言称得上是中文编程的鼻祖。 易语言之后&#xff0c;很多中文编程语言接踵而至&#xff1a;甲语言、乙语言、丙语言、甲骨文编程语言、梅花编程语言等等。 为中国的软件开发者提供了更加便捷和…

什么是aPaaS?aPaaS和低代码是一回事吗?

低代码和aPaaS是近年最为火热的技术趋势之一&#xff0c;那么低代码aPaaS吗&#xff1f;两者有什么关系&#xff1f;今天小帆为大家介绍它们的前世今生。 在介绍低代码和aPaaS前&#xff0c;先要明确一个概念——云服务。云服务是基于互联网的相关服务的增加、使用和交互模式&a…

Profibus-DP转modbus RTU网关profibus主站的实现方案有哪些

远创智控YC-DPM-RTU网关在Profibus总线侧实现主站功能&#xff0c;在Modbus串口侧实现从站功能。可将ProfibusDP协议的设备&#xff08;如&#xff1a;EH流量计、倍福编码器等&#xff09;接入到Modbus网络中&#xff1b;通过增加DP/PA耦合器&#xff0c;也可将Profibus PA从站…

如何获取microstore商品详情接口php接口jason数据字段

随着科技的发展&#xff0c;API接口成为了各行业发展的最新趋势。在微店购物平台中&#xff0c;商品详情API接口的引入&#xff0c;为商家和消费者提供了更加便捷、高效的用户体验。本文将为大家详细介绍微店商品详情API接口的优势和使用方法 商品详情API接口的优势 1.提升用户…

那些隐藏在项目中的kotlin小知识,在座各位...

写kotlin越来越久&#xff0c;很多代码虽然能看懂&#xff0c;并且能去改&#xff0c;但是不知道他用了啥&#xff0c;里面的原理是什么&#xff0c;举个例子&#xff1f;大家一起学习一下吧 内联函数 顾名思义&#xff0c;但是在项目中我遇到得很少&#xff0c;他比较适用于一…

基于互联网下的智能配电网运维

安科瑞 华楠 摘要&#xff1a;在“互联网 ”背景下实现互联网技术和智能配电网的融合成为一种必然趋势&#xff0c;本文主要针对基于“互联网 ”的智能配电网运维技术进行分析&#xff0c;在分析我国目前智能电网运维困境和现状的基础上&#xff0c;构建基于“互联网 ”的智能配…