数据结构的二叉树(c语言版)

一.二叉树的概念

                                             

1.二叉树的基本概念

二叉树是一种常见的树状数据结构,它由若干个节点组成,这些节点通过边连接起来。每个节点最多可以有两个子节点,分别称为左子节点和右子节点。

二叉树的特点是每个节点最多有两个子节点,而且左子节点和右子节点的位置是固定的。通常,左子节点小于或等于父节点,右子节点大于父节点,这种顺序被称为二叉搜索树。

二叉树的一个重要概念是根节点,它是树的起始节点,其他节点通过边与根节点相连。根节点没有父节点。另外,每个节点除了子节点的连接外,还可以有一个指向父节点的连接,这样就形成了一个双向连接的二叉树。

2.二叉树的特殊形态

二叉树还有一些常见的特殊形态,例如满二叉树,每个节点要么没有子节点,要么有两个子节点;完全二叉树,除了最后一层之外,其他层的节点都必须是满的,并且最后一层的节点都靠左排列。

3.二叉树的应用

二叉树可以用于许多应用,例如在计算机科学中常用的二叉搜索树可以用来高效地存储和查找数据。二叉树还可以用于表示表达式、文件系统、网络路由等各种问题的结构化表示。

4.二叉树的优缺点

优点:

  1. 快速的查找:在二叉搜索树中,由于节点的有序性,可以通过比较节点值的大小来快速定位目标节点,因此查找操作的时间复杂度为 O(log n),其中 n 是树中节点的数量。
  2. 快速的插入和删除:同样由于二叉搜索树的有序性,插入和删除操作只需要对数级别的操作,因此效率较高。
  3. 结构简单:相对于其他更复杂的树状数据结构,二叉树的结构相对简单,易于理解和实现。

缺点:

  1. 可能导致不平衡:如果插入的节点顺序不合适,或者是有序数据的插入顺序,可能会导致二叉树的不平衡,进而影响查找、插入和删除操作的效率,甚至退化为链表。
  2. 有序性限制:二叉搜索树的有序性要求限制了节点的插入和删除操作,需要保持树的有序性,这增加了对树的平衡性的要求,同时也限制了一些特殊操作的实现。
  3. 效率不稳定:在最坏的情况下,二叉搜索树的操作时间复杂度可能达到 O(n),其中 n 是树中节点的数量。这种情况通常出现在树的不平衡或有序性不合适的情况下。

二.二叉树的功能

二叉树作为一种常见的数据结构,具有以下功能:

  1. 查找:二叉搜索树(BST)是一种特殊的二叉树,它的左子节点的值小于等于父节点,右子节点的值大于等于父节点。这种有序性使得在BST中可以高效地进行查找操作。通过比较节点的值,可以快速确定目标节点的位置,从而实现快速查找。

  2. 插入和删除:在二叉树中插入和删除节点通常是相对容易的操作。对于BST,插入操作可以根据节点值的大小关系找到合适的位置进行插入。删除操作需要考虑节点的后继或前驱节点,以保持树的有序性。

  3. 遍历:二叉树的遍历包括三种基本方式:前序遍历、中序遍历和后序遍历。前序遍历先访问根节点,然后递归地遍历左子树和右子树;中序遍历先遍历左子树,然后访问根节点,最后遍历右子树;后序遍历先遍历左子树和右子树,最后访问根节点。

  4. 最值查找:通过遍历二叉树,可以找到树中的最小值和最大值。在二叉搜索树中,最小值一定在最左边的叶子节点,最大值一定在最右边的叶子节点。

  5. 平衡性检查和调整:二叉树的平衡性对于保持操作的效率非常重要。当二叉树不平衡时,可以进行相应的调整操作,如旋转、重建等,使得树保持平衡状态。

  6. 应用领域:二叉树可以用于解决各种问题,例如表达式求值、排序算法(如快速排序中的划分操作)、哈夫曼编码、文件系统的组织结构、数据库索引等。它们提供了一种结构化的方式来组织和操作数据。

三.二叉树的代码实现

                                

1.创建二叉树的结构体

struct TreeNode 是用来定义二叉树结点的结构体。它包含以下几个成员:

  1. val:存储结点的值。这个成员变量可以根据实际需要定义为任意类型,这里定义为 int 类型。

  2. left:指向当前结点的左子树的指针。它是一个指针类型,指向另一个 struct TreeNode 结构体,用于表示左子树。

  3. right:指向当前结点的右子树的指针。它也是一个指针类型,指向另一个 struct TreeNode 结构体,用于表示右子树。

通过这样的结构体定义,可以创建二叉树的结点,并通过 left 和 right 指针将这些结点连接起来,形成一个完整的二叉树数据结构。在二叉树的操作中,通过访问结点的 val 成员可以获取结点的值,通过访问 left 和 right 指针可以获取左子树和右子树的结点。这样的结构体定义提供了一种组织和访问二叉树的方式。

// 二叉树结点的定义
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};

2.创建新结点

createNode(int val):创建新结点

  1. 功能:创建一个新的二叉树结点,并初始化其值。
  2. 输入参数:val:要存储在新结点中的值。
  3. 返回值:指向新创建结点的指针。
// 创建新结点
struct TreeNode* createNode(int val) {struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));newNode->val = val;newNode->left = NULL;newNode->right = NULL;return newNode;
}

3.插入结点

insertNode(struct TreeNode* root, int val)

  1. 功能:将一个新的结点插入到二叉树中。
  2. 输入参数:val:要插入的值。
  3. root:指向二叉树的根结点的指针。
  4. 返回值:指向更新后的二叉树根结点的指针。运行原理:根据二叉搜索树的性质,如果要插入的值小于当前结点的值,则将其插入到左子树中;如果要插入的值大于等于当前结点的值,则将其插入到右子树中。递归地在合适的子树上调用插入函数,直到找到合适的位置插入新结点。
// 插入结点
struct TreeNode* insertNode(struct TreeNode* root, int val) {if (root == NULL) {return createNode(val);}if (val < root->val) {root->left = insertNode(root->left, val);} else {root->right = insertNode(root->right, val);}return root;
}

4.前序遍历 

​​​​​​​preorderTraversal(struct TreeNode* root)

  1. 功能:对二叉树进行前序遍历,即先访问根结点,然后递归地遍历左子树和右子树。
  2. 输入参数:root:指向二叉树根结点的指针。
  3. 返回值:无。
  4. 运行原理:递归地进行前序遍历,首先输出当前结点的值,然后先递归遍历左子树,再递归遍历右子树。
// 前序遍历
void preorderTraversal(struct TreeNode* root) {if (root != NULL) {printf("%d ", root->val);preorderTraversal(root->left);preorderTraversal(root->right);}
}

四.二叉树的源码呈现

#include <stdio.h>
#include <stdlib.h>// 二叉树结点的定义
struct TreeNode {int val;struct TreeNode* left;struct TreeNode* right;
};// 创建新结点
struct TreeNode* createNode(int val) {struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));newNode->val = val;newNode->left = NULL;newNode->right = NULL;return newNode;
}// 插入结点
struct TreeNode* insertNode(struct TreeNode* root, int val) {if (root == NULL) {return createNode(val);}if (val < root->val) {root->left = insertNode(root->left, val);} else {root->right = insertNode(root->right, val);}return root;
}// 前序遍历
void preorderTraversal(struct TreeNode* root) {if (root != NULL) {printf("%d ", root->val);preorderTraversal(root->left);preorderTraversal(root->right);}
}int main() {struct TreeNode* root = NULL;root = insertNode(root, 5);insertNode(root, 3);insertNode(root, 8);insertNode(root, 2);insertNode(root, 4);insertNode(root, 7);insertNode(root, 9);printf("Preorder traversal: ");preorderTraversal(root);return 0;
}

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

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

相关文章

Eplan2.9版本安装教程指南【附安装包】

文章目录 前言一、Eplan是什么&#xff1f;二、安装指南1、安装包获取2、安装步骤在这里插入图片描述 总结 前言 随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介绍了机器学习的基础内容。 提示&…

【报错合集】完美解决“虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本”

文章目录 解决方案&#xff1a;更改设置的硬件版本 今天我需要将别人的虚拟机克隆到我的VMware Workstation上运行&#xff0c;结果发生了以下的错误&#xff1a; 刚开始以为是VMware Workstation的版本问题太低导致的&#xff0c;所以我删除了原来的那个版本&#xff0c;下载…

开源分布式爬虫管理平台:性能强悍!!【送源码】

简介 基于 Golang 的分布式爬虫管理平台&#xff0c;支持 Python、NodeJS、Go、Java、PHP 等多种编程语言以及多种爬虫框架。 谁适合使用 Crawlab? 网路爬虫工程师&#xff1a; 通过集成爬虫程序到 Crawlab&#xff0c;网路爬虫工程师可以聚焦于爬虫的核心解析逻辑&#xff0…

WCF 双工 回调模式

wcfInterface 项目 》》》wcf服务端提供的服务协议 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ServiceModel; namespace wcfInterface {[ServiceContract(CallbackContract typeo…

【软考网络工程师】每日练题学知识

1.在EIGRP协议中&#xff0c;某个路由器收到了两条路径到达目标网络&#xff0c;路径1的带宽为100Mbps&#xff0c;延迟2ms&#xff0c;路径2的带宽为50Mbps&#xff0c;迟为4ms&#xff0c;如果EIGRP使用带宽和延迟的综合度量标准&#xff0c;那么该路由器选择的最佳路径是&am…

鸿蒙内核源码分析(工作模式篇) | CPU的七种工作模式

本篇说清楚CPU的工作模式 工作模式(Working mode) 也叫操作模式&#xff08;Operating mode&#xff09;又叫处理器模式&#xff08;Processor mode&#xff09;&#xff0c;是 CPU 运行的重要参数&#xff0c;决定着处理器的工作方式&#xff0c;比如如何裁决特权级别和报告异…

实时追踪维修进度,报修管理小程序让你省心又省力!

随着生活、工作节奏的日益加快&#xff0c;日常的售后报修、故障报修处理流程给我们带来种种困扰。我们都知道大多数企业、个人用户还在使用传统报修方式&#xff0c;如电话报修、纸质报修单等方式&#xff0c;不仅效率低下&#xff0c;而且难以追踪维修进度&#xff0c;给我们…

AI游戏外挂为何违法?

尊敬的读者们&#xff0c;大家好&#xff01;今天我想和大家探讨一个备受争议的话题——AI游戏外挂的合法性。近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;AI外挂逐渐成为游戏领域的一大毒瘤。那么&#xff0c;为什么AI游戏外挂会被视为违法行为呢&#xff1f;本…

【中级软件设计师】上午题16-算法(应试考试简略版)

上午题16-算法 1 回溯法1.1 n皇后问题 2 分治法3 动态规划3.1 0-1背包问题3.2 最长公共子序列3.3 矩阵连乘 4 贪心算法5 分支限界法总结 1 回溯法 深度优先方法搜索 1.1 n皇后问题 2 分治法 一般来说&#xff0c;分治算法在每一层递归上都有3个步骤 &#xff08;1&#xff…

C++——缺省参数与重载函数

目录 ​前言 一.缺省参数 1.1缺省参数概念 1.2缺省参数分类 注意事项&#xff1a; 二.函数重载 2.1函数重载概念 2.2c支持函数重载原理——命名修饰 前言 本篇文章主要讲述c中有关于缺少参数与函数重载的相关概念与实例&#xff0c;以下是本人拙见&#xff0c;如有错误…

【Linux学习笔记】一篇文章彻底搞定“Linux生产者与消费者“!

本章重点 1.生产者消费者模型2.posix信号量&#xff0c;以及读写锁。3. 理解基于读写锁的读者写者问题。 一. 生产者消费者模型 为何要使用生产者消费者模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯&#xff0…

专业音频修复软件:iZotope RX 11 for Mac 激活版

iZotope RX 专为满足后期制作专业人士的苛刻需求而设计的一款专业音频修复软件。iZotope RX 10添加了新的特性和功能&#xff0c;以解决当今后期项目中存在的一些最常见的修复问题&#xff0c;使其成为音频后期制作的最终选择。虽然包含许多其他新功能&#xff0c;但这里是新的…

微信小程序的设计与实现

微信小程序的设计与实现 目录 1.系统简述&#xff1a; 2.开发工具及相关技术&#xff1a; 2.1 HTML、WXSS、JAVASCRIPT技术 2.2 Vanilla框架 2.3 uni-app框架 2.4 MYSQL数据库 3.工程结构及其说明&#xff1a; 4.主要功能展示 4.1登录 4.2 注册 4.3 首页…

【C++11】C++11类与模板语法的完善

目录 一&#xff0c;新的类功能 1-1&#xff0c;默认成员函数 1-2&#xff0c;强制生成关键字 二&#xff0c;可变参数模板 2-1&#xff0c;模板参数包 2-3&#xff0c;模板参数包的实际运用 2-2&#xff0c;STL容器empalce的相关接口 三&#xff0c;模板参数包和empla…

002.反应式编程的必要性

在实际应用程序中&#xff0c;您可以在许多情况下发现可能的时变变量—例如&#xff0c;GPS位置、温度、鼠标坐标&#xff0c;甚至文本框的内容。所有这些都有一个随时间变化的值应用程序会发生反应&#xff0c;因此是时变的。还有一点值得一提时间本身就是一个时变;它的值一直…

Unicode字符集和UTF编码

文章目录 前言一、字符集和编码方式二、unicode字符集utf32编码utf8编码utf8编码函数示例utf8解码函数示例 utf16编码utf16编码解码函数示例 总结 前言 本文详细介绍 u n i c o d e unicode unicode 字符集和其相关的三种编码方式&#xff1a; u t f 8 utf8 utf8&#xff0c;…

华为认证存储HCIE有用吗?

首先&#xff0c;对于个人来说&#xff0c;获得华为存储认证可以证明其具备信息存储技术的专业能力 1.专业认可&#xff1a;获得华为存储认证&#xff0c;尤其是HCIE-Storage级别的证书&#xff0c;意味着持有者对信息存储技术有着全面深入的理解&#xff0c;能够设计、部署、…

JPA@Entry报错Could not determine recommended JdbcType for Java type

问题很明显&#xff0c;无法自动决定类型&#xff0c;那就手动告诉该字段。 一、直接上解决方案 如果是一对一的关系用 OneToOne 如果是一对多的关系用 OneToMany 如果是多对一的关系用 ManyToOne 二、另一个无空构造函数的问题 使用注解后&#xff0c;注解报错找不到空的…

实训八:使用jQuery技术实现企业信息展示系统的相关功能

实训八:使用jQuery技术实现企业信息展示系统的相关功能 1.题目 使用jQuery技术实现企业信息展示系统的相关功能。 2.目的 (1)掌握jQuery的基本知识。 (2)掌握jQuery的应用方法。 (3)进一步理解Ajax程序的设计方法。 (4)会利用所学知识设计简单的应用程序。 3.内容 用jQuery技术…

【SpringBoot记录】从基本使用案例入手了解SpringBoot-数据访问-更改DataSource(2)

前言 通过上一个数据访问基本案例成功可以发现&#xff0c;SpringBoot在数据访问案例中也做了许多自动配置&#xff0c;上节只分析了其中的Properties。 而在自动配置包的jdbc下 还有其他配置文件。 根据名称可以大致了解他们的作用&#xff1a; DataSourceAutoConfiguration…