算法-二叉树

1. 二叉树定义

二叉树是一种常见的树状数据结构,它由节点组成,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的定义如下:

  • 节点(Node):每个节点包含一个数据元素(通常是一个值)以及指向其左子节点和右子节点的指针。这个数据元素可以是整数、字符、对象等,具体取决于应用程序的需求。
  • 根节点(Root Node):二叉树的顶部节点称为根节点。它是树的起点,通常是访问整个二叉树的入口点。
  • 叶子节点(Leaf Node):叶子节点是没有子节点的节点,它们位于二叉树的底部。
  • 父节点(Parent Node):每个节点都可以有一个父节点,即指向它的节点。
  • 子节点(Child Node):每个节点最多有两个子节点,分别称为左子节点和右子节点。
  • 深度(Depth):从根节点到某个节点的唯一路径上的边数称为该节点的深度。
  • 高度(Height):二叉树的高度是树中任何节点的最大深度。也可以定义为空树的高度为-1,只有根节点的树的高度为0。
  • 子树(Subtree):二叉树中的任何节点都可以看作是根节点的子树,包含该节点及其所有后代节点。
  • 二叉搜索树(Binary Search Tree,BST):如果二叉树满足以下条件,即对于树中的每个节点,其左子树中的所有节点的值都小于它的值,而右子树中的所有节点的值都大于它的值,那么这棵树就是二叉搜索树。BST具有有序性质,因此在查找、插入和删除操作上具有高效性能。
  • 平衡二叉树(Balanced Binary Tree):平衡二叉树是一种特殊的二叉搜索树,其左子树和右子树的高度差不超过1。平衡二叉树的目的是确保树的高度不会过高,以保持高效的操作性能。

1.1 二叉树的定义

// 定义二叉树节点结构
struct TreeNode {int data;struct TreeNode* left;struct TreeNode* right;
};

1.2 二叉树的应用场景

  1. 文件系统:
    目录结构:Linux文件系统使用树形结构,其中每个目录可以包含子目录和文件。这种结构可以轻松地用二叉树表示,其中每个目录是一个节点,包含指向子目录和文件的指针。

  2. 进程管理:
    进程调度:操作系统使用调度算法来管理运行中的进程。二叉堆是一种二叉树数据结构,常用于实现进程调度算法(如最小堆)。

  3. 数据搜索:
    二叉搜索树:在Linux中,二叉搜索树(BST)常用于快速搜索和排序数据。例如,文件系统中的索引、数据库管理系统中的索引结构等都可以使用BST来实现高效的数据检索。

  4. 存储管理:
    内存管理:操作系统使用二叉树数据结构来管理系统内存,例如红黑树用于管理内存分配和释放的数据结构,以维护可用和已分配的内存块。

  5. 系统调用表:
    系统调用表:Linux内核维护了一个系统调用表,其中包含可用的系统调用和相应的函数指针。这个表可以用二叉树来组织,以便在系统调用的注册、查找和执行过程中实现高效的操作。

  6. 路由表:
    IP路由表:Linux路由表用于确定数据包应该通过哪个接口进行转发。通常,路由表的实现使用二叉树或其他数据结构,以便快速查找最佳路由。

  7. 进程树:
    进程树:在Linux系统中,进程通常以树状结构的方式组织,其中每个进程都有一个父进程和零个或多个子进程。这种组织结构可以看作是一个树,其中根是init进程,子进程是由父进程创建的。

  8. 日志文件管理:
    日志文件归档:一些应用程序需要管理大量的日志文件,这些文件可以使用二叉树来组织,以便快速查找和检索特定日期或事件的日志。

2. 二叉树常用函数方法

2.1 创建节点

struct TreeNode* createNode(int data) {struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));if (newNode) {newNode->data = data;newNode->left = NULL;newNode->right = NULL;}return newNode;
}

2.2 插入节点到二叉树

struct TreeNode* insertNode(struct TreeNode* root, int data) {if (root == NULL) {return createNode(data);}if (data < root->data) {root->left = insertNode(root->left, data);} else if (data > root->data) {root->right = insertNode(root->right, data);}return root;
}

2.3 二叉树遍历

// 中序遍历二叉树(升序)
void inorderTraversal(struct TreeNode* root) {if (root) {inorderTraversal(root->left);printf("%d ", root->data);inorderTraversal(root->right);}
}// 前序遍历二叉树
void preorderTraversal(struct TreeNode* root) {if (root) {printf("%d ", root->data);preorderTraversal(root->left);preorderTraversal(root->right);}
}// 后序遍历二叉树
void postorderTraversal(struct TreeNode* root) {if (root) {postorderTraversal(root->left);postorderTraversal(root->right);printf("%d ", root->data);}
}

2.4 二叉树深度计算

// 计算二叉树的深度(递归函数)
int calculateDepth(struct TreeNode* root) {if (root == NULL) {return 0;} else {int leftDepth = calculateDepth(root->left);int rightDepth = calculateDepth(root->right);return (leftDepth > rightDepth) ? (leftDepth + 1) : (rightDepth + 1);}
}

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

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

相关文章

python常用库之数据库orm框架之SQLAlchemy

文章目录 python常用库之数据库orm框架之SQLAlchemy一、什么是SQLAlchemySQLAlchemy 使用场景 二、SQLAlchemy使用SQLAlchemy根据模型查询SQLAlchemy SQL 格式化的方式db_session.query和 db_session.execute区别实测demo 总结&#xff1a;让我们留意一下SQLAlchemy 的 lazy lo…

SpringMVC的视图

文章目录 1. ThymeleafView2. 转发视图3. 重定向视图4. 视图控制器view-controller5. 总结6. 荐书 SpringMVC中的视图是View接口&#xff0c;视图的作用渲染数据&#xff0c;将模型Model中的数据展示给用户SpringMVC视图的种类很多&#xff0c;默认有转发视图和重定向视图 当工…

二维反射容斥:P9366

https://www.luogu.com.cn/problem/P9366 构造循环矩阵&#xff0c;考虑反射容斥和将军饮马 考虑二维不太好做&#xff0c;我们曼哈顿距离转切比雪夫距离&#xff0c;变成一维的情况。 由于棋盘是正方形的&#xff0c;所以循环长度为 2 n 4 2n4 2n4。用多项式快速幂预处理&…

el-cascader

场景&#xff1a; el-cascader lazy multiple 反显数据 非lazy的场景 selecetedOptions2: [[1, 2, 3],[1, 2, 4], ],可以正常回显&#xff1b;> ok lazy场景下&#xff1a; 是不可以回显的… 如果el-cascader是异步的单选 cascader默认会加载下个层级的&#xff08;子…

Unity设计模式——原型模式

原型模式&#xff08;Prototype&#xff09;用原型实例指定创建对象的种类&#xff0c;并且通过拷贝这些原型创建新的对象。原型模式其实就是从一个对象再创建另外一个可定制的对象&#xff0c;而且不需知道任何创建的细节 。 原型类 Prototype&#xff1a; abstract class P…

十一、2023.10.5.计算机网络(end).11

文章目录 17、说说 TCP 可靠性保证&#xff1f;18、简述 TCP 滑动窗口以及重传机制?19、说说滑动窗口过小怎么办?20、说说如果三次握手时候每次握手信息对方没收到会怎么样&#xff0c;分情况介绍&#xff1f;21、简述 TCP 的 TIME_WAIT&#xff0c;为什么需要有这个状态&…

虚拟机机初始化配置

虚拟机信息 镜像&#xff1a;Centos7 模板机配置&#xff1a;4U4G 100G存储 /boot 800MB /swap 物理内存如果低于2G&#xff0c;设定为虚拟内存设定为物理内存2倍&#xff0c;物理内存高于2G设定为4G。 / 95.2G 虚拟机安装完成后配置网卡 [rootlocalho…

ctfshow-web5(md5弱比较)

打开题目链接是html和php代码 html没啥有用信息&#xff0c;这里审一下php代码 &#xff1a; 要求使用get方式传入两个参数 v1&#xff0c;v2 ctype_alpha()函数&#xff1a;用于检查给定的字符串是否仅包含字母&#xff1b; is_numeric()函数&#xff1a;检测字符串是否只由…

聊聊分布式架构05——[NIO基础]BIO到NIO的演进

目录 I/O I/O模型 BIO示例 BIO与NIO比较 NIO的三大核心 NIO核心之缓冲区 Buffer常用子类&#xff1a; Buffer常用API Buffer中的重要概念 NIO核心之通道 FileChannel 类 FileChannel常用方法 NIO核心之选择器 概述 应用 NIO非阻塞原理分析 服务端流程 客户端…

请求的转发和重定向

RequestDispatcher接口实现转发&#xff1a; jsp1上链接到Servlet&#xff0c;Servlet再转发&#xff08;关键在这里怎么实现转发&#xff1f;&#xff1f;&#xff09; 演示index.html页面---->Servlet1(转发到)------>Servlet2 实现转发流程 1.用HttpServletReques…

如何解决openal32.dll丢失,有什么办法解决

你第一次知道openal32.dll文件是在什么情况下&#xff0c;你了解过openal32.dll文件吗&#xff1f;如果电脑中openal32.dll丢失有什么办法可以解决&#xff0c;今天就教大家如何解决openal32.dll丢失&#xff0c;都有哪些办法可以解决openal32.dll丢失。 一&#xff0e;openal3…

Mac下docker安装MySQL8.0.34

学习并记录一下如何用docker部署MySQL 在Docker中搜索并下载MySQL8.0.x的最新版本 下载好后&#xff0c;在Images中就可以看到MySQL的镜像了 通过下面的命令也可以查看docker images启动镜像&#xff0c;使用下面的命令就可以启动镜像了docker run -itd --name mysql8.0.34 -…

2021年03月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python编程&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 对于字典infor {“name”:“tom”, “age”:13, “sex”:“male”}&#xff0c;删除"age":13键值对的操作正确的…

蓝桥杯每日一题2023.10.9

题目描述 成绩统计 - 蓝桥云课 (lanqiao.cn) 题目分析 学会使用四舍五入函数round #include<bits/stdc.h> using namespace std; int s1, s2; int main() {int n, x;cin >> n;for(int i 1; i < n; i ){cin >> x; if(x > 60)s1 ;if(x > 85)s2 ;…

C语言练习百题之插入一个数

题目:有一个已经排好序的数组。现输入一个数&#xff0c;要求按原来的规律将它插入数组中。 程序分析 要将一个数插入已经排好序的数组中&#xff0c;我们可以采用以下步骤&#xff1a; 遍历数组&#xff0c;找到第一个大于待插入数的位置。将待插入数插入到该位置&#xff…

关于一篇ElementUI之CUD+表单验证

目录 一.CUD增删改查简述 1.1.增删改功能实现 二.表单验证 前端所有代码&#xff1a; 好啦今天就分享到这了&#xff0c;希望能帮到你哦&#xff01;&#xff01;&#xff01; 以下的代码基于我博客中的代码进行续写 : 关于ElementUI之动态树数据表格分页实例 一.CUD增删改…

北斗导航 | 位置差分、伪距差分以及载波相位平滑伪距(差分定位方法二)

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 位置差分、伪距差分以及载波相位平滑伪距 位置差分伪距差分载波相位平滑…

【算法练习Day14】二叉树的最大深度二叉树的最小深度完全二叉树的节点个数

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 二叉树的最大深度二叉树的最…

【Qt控件之QDialog】使用及技巧

简介 QDialog是Qt中的一个类&#xff0c;继承自QWidget类&#xff0c;用于创建对话框窗口&#xff0c;可以显示模态&#xff08;阻塞当前窗口&#xff09;或非模态的对话框。对话框可以包含各种控件&#xff0c;如按钮、文本框等&#xff0c;用于与用户进行交互。 主要函数说…

19哈希表——数组中的妙用

目录 LeetCode之路——202. 快乐数 分析&#xff1a; LeetCode之路——1. 两数之和 分析&#xff1a; 解法一&#xff1a;暴力枚举 解法二&#xff1a;哈希表 LeetCode之路——202. 快乐数 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对…