当前位置: 首页 > news >正文

数据结构--树

一、树的概念

树是由n(n≥0)个节点组成的有限集合,它满足以下条件:
 
1. 当n=0时,称为空树
2. 当n>0时,有且仅有一个特定的节点称为根节点(root)
3. 其余节点可分为m(m≥0)个互不相交的有限集合,每个集合本身又是一棵树,称为根的子树(subtree)
 
二、基本术语
 
- 节点(Node): 树的基本单位,包含数据项和指向其他节点的指针
- 边(Edge): 连接两个节点的线
- 根节点(Root): 树的最顶层节点,没有父节点
- 父节点(Parent): 一个节点的直接上层节点
- 子节点(Child): 一个节点的直接下层节点
- 叶子节点(Leaf): 没有子节点的节点
- 内部节点(Internal Node): 至少有一个子节点的节点
- 度(Degree): 一个节点拥有的子节点数目
- 树的度: 树中所有节点度的最大值
- 层次(Level): 根节点为第1层,其子节点为第2层,以此类推
- 高度/深度(Height/Depth): 树中节点的最大层次数
- 兄弟节点(Sibling): 具有相同父节点的节点
- 祖先节点(Ancestor): 从根到该节点路径上的所有节点
- 后代节点(Descendant): 某节点子树中的所有节点
 
三、树的分类
 
1. 二叉树(Binary Tree): 每个节点最多有两个子节点
- 满二叉树
- 完全二叉树
- 二叉搜索树(BST)
- 平衡二叉树(AVL树)
- 红黑树
2. 多叉树: 每个节点可以有多个子节点
- B树
- B+树
- Trie树(字典树)
3. 其他特殊树结构
- 堆(Heap)
- 哈夫曼树
- 线段树
- 树状数组
 
四、树的存储表示
 
1. 链式存储
- 每个节点包含数据域和指针域
- 指针指向子节点
2. 顺序存储
- 使用数组存储
- 对于完全二叉树特别有效
 3.树的简单实现

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;// 定义树节点类模板
template <typename T>
class TreeNode
{
public:T data;  // 节点存储的数据TreeNode* firstChild;  // 指向该节点的第一个孩子节点TreeNode* nextSibling; // 指向该节点的下一个兄弟节点// 构造函数,初始化节点数据,将孩子和兄弟指针置为空TreeNode(T val) : data(val), firstChild(nullptr), nextSibling(nullptr) {}
};// 定义树类模板
template <typename T>
class Tree
{
private:TreeNode<T>* root;  // 树的根节点// 递归清空树的辅助函数void clear(TreeNode<T>* node){if (node == nullptr) return;  // 如果节点为空,直接返回clear(node->firstChild);  // 递归清空当前节点的第一个孩子节点及其子树clear(node->nextSibling); // 递归清空当前节点的下一个兄弟节点及其子树delete node;  // 释放当前节点的内存}public:// 构造函数,初始化根节点为空Tree() : root(nullptr) {}// 析构函数,调用 clear 函数清空整棵树~Tree() { clear(root); }// 创建一个新的树节点,返回新节点的指针TreeNode<T>* createNode(T data){return new TreeNode<T>(data);}// 设置树的根节点void setRoot(TreeNode<T>* node){root = node;}// 获取树的根节点TreeNode<T>* getRoot() const{return root;}// 向指定父节点插入一个孩子节点void insertChild(TreeNode<T>* parent, TreeNode<T>* child){if (parent == nullptr) return;  // 如果父节点为空,直接返回if (parent->firstChild == nullptr){// 如果父节点没有第一个孩子节点,将该孩子节点设为第一个孩子parent->firstChild = child;}else{// 否则,找到父节点孩子链表的末尾,将该孩子节点插入到末尾TreeNode<T>* sibling = parent->firstChild;while (sibling->nextSibling != nullptr){sibling = sibling->nextSibling;}sibling->nextSibling = child;}}// 前序遍历树void preOrderTraversal(TreeNode<T>* node){if (node == nullptr) return;  // 如果节点为空,直接返回cout << node->data << " ";  // 访问当前节点的数据preOrderTraversal(node->firstChild);  // 递归前序遍历当前节点的第一个孩子节点及其子树preOrderTraversal(node->nextSibling); // 递归前序遍历当前节点的下一个兄弟节点及其子树}// 后序遍历树void postOrderTraversal(TreeNode<T>* node){if (node == nullptr) return;  // 如果节点为空,直接返回postOrderTraversal(node->firstChild);  // 递归后序遍历当前节点的第一个孩子节点及其子树cout << node->data << " ";  // 访问当前节点的数据postOrderTraversal(node->nextSibling); // 递归后序遍历当前节点的下一个兄弟节点及其子树}// 层序遍历树void levelOrderTraversal(){if (root == nullptr) return;  // 如果根节点为空,直接返回queue<TreeNode<T>*> q;  // 定义一个队列用于层序遍历q.push(root);  // 将根节点入队while (!q.empty()){TreeNode<T>* current = q.front();  // 获取队首节点q.pop();  // 队首节点出队cout << current->data << " ";  // 访问当前节点的数据// 将当前节点的所有孩子节点依次入队TreeNode<T>* child = current->firstChild;while (child != nullptr){q.push(child);child = child->nextSibling;}}}// 获取树的高度int getHeight(TreeNode<T>* node){if (node == nullptr) return 0;  // 如果节点为空,高度为 0int maxHeight = 0;  // 初始化最大子树高度为 0TreeNode<T>* child = node->firstChild;while (child != nullptr){// 递归计算每个子树的高度,并更新最大子树高度maxHeight = max(maxHeight, getHeight(child));child = child->nextSibling;}return maxHeight + 1;  // 当前节点的高度为最大子树高度加 1}// 计算树中节点的总数int countNodes(TreeNode<T>* node){if (node == nullptr) return 0;  // 如果节点为空,节点数为 0// 当前节点及其子树的节点总数为当前节点加上其第一个孩子节点及其子树的节点数,再加上其兄弟节点及其子树的节点数return 1 + countNodes(node->firstChild) + countNodes(node->nextSibling);}// 在树中查找值为 value 的节点TreeNode<T>* findNode(TreeNode<T>* node, T value){if (node == nullptr) return nullptr;  // 如果节点为空,返回空指针if (node->data == value) return node;  // 如果当前节点的值等于要查找的值,返回当前节点的指针// 先在当前节点的第一个孩子节点及其子树中查找TreeNode<T>* found = findNode(node->firstChild, value);if (found != nullptr) return found;// 若未找到,再在当前节点的下一个兄弟节点及其子树中查找return findNode(node->nextSibling, value);}// 打印树的结构,level 表示当前节点的层级void printTree(TreeNode<T>* node, int level = 0){if (node == nullptr) return;  // 如果节点为空,直接返回// 根据当前节点的层级打印相应数量的空格for (int i = 0; i < level; ++i){cout << "  ";}cout << node->data << endl;  // 打印当前节点的数据// 递归打印当前节点的第一个孩子节点及其子树,层级加 1printTree(node->firstChild, level + 1);// 递归打印当前节点的下一个兄弟节点及其子树,层级不变printTree(node->nextSibling, level);}
};int main()
{Tree<char> tree;  // 创建一个存储字符类型数据的树对象// 创建树的各个节点TreeNode<char>* A = tree.createNode('A');TreeNode<char>* B = tree.createNode('B');TreeNode<char>* C = tree.createNode('C');TreeNode<char>* D = tree.createNode('D');TreeNode<char>* E = tree.createNode('E');TreeNode<char>* F = tree.createNode('F');TreeNode<char>* G = tree.createNode('G');// 构建树的结构tree.setRoot(A);  // 设置 A 为根节点tree.insertChild(A, B);  // 将 B 插入为 A 的孩子节点tree.insertChild(A, C);  // 将 C 插入为 A 的孩子节点tree.insertChild(A, D);  // 将 D 插入为 A 的孩子节点tree.insertChild(B, E);  // 将 E 插入为 B 的孩子节点tree.insertChild(B, F);  // 将 F 插入为 B 的孩子节点tree.insertChild(D, G);  // 将 G 插入为 D 的孩子节点// 打印树的结构cout << "Tree structure:" << endl;tree.printTree(tree.getRoot());cout << endl;// 进行各种遍历测试cout << "Pre-order traversal: ";tree.preOrderTraversal(tree.getRoot());cout << endl;cout << "Post-order traversal: ";tree.postOrderTraversal(tree.getRoot());cout << endl;cout << "Level-order traversal: ";tree.levelOrderTraversal();cout << endl;// 测试其他功能cout << "Tree height: " << tree.getHeight(tree.getRoot()) << endl;cout << "Total nodes: " << tree.countNodes(tree.getRoot()) << endl;// 测试查找节点功能char searchValue = 'F';TreeNode<char>* found = tree.findNode(tree.getRoot(), searchValue);if (found){cout << "Found node: " << found->data << endl;}else{cout << "Node " << searchValue << " not found" << endl;}return 0;
}


五、树的应用
 
- 文件系统目录结构
- 数据库索引
- 网络路由算法
- 决策树(机器学习)
- XML/HTML文档对象模型(DOM)
- 组织结构图
- 游戏中的场景图
 
树结构因其高效的查找、插入和删除操作(O(log n)时间复杂度)而被广泛应用于各种算法和系统中。

相关文章:

数据结构--树

一、树的概念 树是由n(n≥0)个节点组成的有限集合&#xff0c;它满足以下条件&#xff1a; 1. 当n0时&#xff0c;称为空树 2. 当n>0时&#xff0c;有且仅有一个特定的节点称为根节点(root) 3. 其余节点可分为m(m≥0)个互不相交的有限集合&#xff0c;每个集合本身又是一…...

5月7号.

flex布局: 表单标签: 表单标签-表单项:...

Spark 之 YarnCoarseGrainedExecutorBackend

YarnCoarseGrainedExecutorBackend executor ID , 在日志里也有体现。 25/05/06 12:41:58 INFO YarnCoarseGrainedExecutorBackend: Successfully registered with driver 25/05...

Webug4.0靶场通关笔记19- 第24关邮箱轰炸

目录 第24关 邮箱轰炸 1.配置环境 2.打开靶场 3.源码分析 4.邮箱轰炸 &#xff08;1&#xff09;注册界面bp抓包 &#xff08;2&#xff09;发送到intruder &#xff08;3&#xff09;配置position &#xff08;4&#xff09;配置payload &#xff08;5&#xff09;开…...

机器学习实战:6种数据集划分方法详解与代码实现

在机器学习项目中&#xff0c;合理划分数据集是模型开发的关键第一步。本文将全面介绍6种常见数据格式的划分方法&#xff0c;并附完整Python代码示例&#xff0c;帮助初学者掌握这一核心技能。 一、数据集划分基础函数 1. 核心函数&#xff1a;train_test_split from sklea…...

PostgreSQL 查询历史最大进程数方法

PostgreSQL 查询历史最大进程数方法 PostgreSQL 提供了多种方式来查询数据库的历史最大进程数&#xff08;连接数&#xff09;。以下是几种有效的方法&#xff1a; 一、使用统计收集器数据 1. 查看当前统计信息 SELECT max_connections, (SELECT setting FROM pg_settings …...

第十二节:图像处理基础-图像平滑处理 (均值滤波、高斯滤波、中值滤波)

在数字图像处理中&#xff0c;图像平滑&#xff08;Image Smoothing&#xff09;是去除噪声、改善图像质量的关键技术之一。通过滤波算法&#xff0c;可以有效地抑制高频噪声&#xff0c;但同时可能牺牲部分图像细节。本文将以均值滤波、高斯滤波和中值滤波为核心&#xff0c;结…...

Python中的global与nonlocal关键字详解

一、前言 在Python编程中&#xff0c;变量作用域是一个非常重要的概念。对于初学者来说&#xff0c;经常会遇到在函数内部无法修改外部变量的问题。这时候&#xff0c;global和nonlocal关键字就能派上用场了。本文将详细介绍这两个关键字的用法、区别以及适用场景&#xff0c;…...

LVGL-对象 lv_obj_t

LVGL-对象 lv_obj_t **LVGL 对象核心概念总结****1. 对象与控件的关系****2. 对象的基本属性****3. 父子对象结构****4. 屏幕与图层管理****活动屏幕&#xff08;Active Screen&#xff09;****图层&#xff08;Layers&#xff09;** **5. 关键函数与操作****6. 面向对象设计的…...

【C/C++】ARM处理器对齐_伪共享问题

文章目录 1 什么是伪共享&#xff1f;2 为什么对齐&#xff1f;3 伪共享的实际影响4 为什么必须是 64 字节&#xff1f;5 其他替代方案6 验证对齐效果总结 1 什么是伪共享&#xff1f; 伪共享是 多线程编程中的一种性能问题&#xff0c;其本质是&#xff1a; 缓存行&#xff…...

【优化策略】离散化

概念 离散化是算法设计中处理大数据范围时的关键技巧&#xff0c;它将大范围的数据映射到有较小的的离散空间中&#xff0c;同时保持数据的相对关系。 本质&#xff1a;将原始数据映射到紧凑的连续整数空间 数学表示&#xff1a;建立映射函数 f: ℝ → ℤ&#xff0c;满足 x…...

微粉助手 1.1.0 | 专为社交电商用户设计的一站式营销工具,集成了群发消息、智能加好友、清理僵尸粉等功能

微粉助手是一款专为社交电商用户设计的一站式营销工具。此会员版无需登录&#xff0c;去除了更新检测&#xff0c;并优化了启动速度。它集成了群发消息、智能添加好友、精准清理僵尸粉、自动跟圈以及短视频获客等核心功能&#xff0c;是企业实现社交媒体营销自动化的理想选择。…...

【代码优化篇】强缓存和协商缓存

强缓存和协商缓存 一、强缓存与协商缓存的区别二、Vue2 前端实现强缓存&#xff08;静态资源&#xff09;三、Spring Boot 后端实现协商缓存&#xff08;动态接口&#xff09;四、测试缓存效果五、注意事项 一、强缓存与协商缓存的区别 强缓存&#xff1a;浏览器直接读取本地缓…...

分区器(2)

2. 设置ReduceTask 在MapReduce框架中&#xff0c;Reducer的数量&#xff08;即ReduceTask的数量&#xff09;可以通过配置参数来设置。 设置方法 通过配置文件&#xff1a; 在mapred-site.xml文件中设置mapreduce.job.reduces参数&#xff1a; xml <property><nam…...

外包团队协作效率低,如何优化

外包团队协作效率低是许多公司面临的挑战&#xff0c;尤其是在跨地域、跨文化和远程工作环境下。 优化外包团队的协作效率需要从沟通方式、项目管理工具、文化差异及团队结构等多个方面入手。首先&#xff0c;明确的沟通与及时的反馈是提高团队效率的基础&#xff0c; 通过定期…...

2020年NCA CCF-C,改进灰狼算法RSMGWO+大规模函数优化,深度解析+性能实测

目录 1.摘要2.灰狼算法GWO原理3.改进策略4.结果展示5.参考文献6.代码获取7.读者交流 1.摘要 灰狼优化算法&#xff08;GWO&#xff09;是一种新型自然启发式算法&#xff0c;具备较强的局部搜索能力&#xff0c;但在处理大规模问题时全局搜索能力较弱。本文提出了改进灰狼算法…...

【EasyPan】saveShare代码分析

【EasyPan】项目常见问题解答&#xff08;自用&持续更新中…&#xff09;汇总版 保存分享文件到个人网盘代码分析 一、代码结构概览 该代码实现了一个将他人分享的文件保存到自己网盘的功能&#xff0c;主要分为三个部分&#xff1a; 控制器层&#xff08;Controller&a…...

基于Django框架开发的B2C天天生鲜电商平台

天天生鲜 介绍 天天生鲜是一个基于Django框架开发的B2C(Business-to-Customer)电商平台&#xff0c;专注于生鲜食品的在线销售。该项目采用了主流的Python Web开发框架Django&#xff0c;结合MySQL数据库、Redis缓存等技术&#xff0c;实现了一个功能完整、界面友好的电商网站…...

[数据库之九] 数据库索引之顺序索引

1、什么是索引&#xff1f; 拿到一本书&#xff0c;想直接跳到感兴趣的章节&#xff0c;而不是从头看到尾&#xff0c;这时需要看书的目录&#xff0c;上面列出章节和对应的页码&#xff0c;这里的目录可以看成是书的索引&#xff0c;如果没有索引&#xff0c;要查找书中某块内…...

使用 Celery + Redis + Eventlet 实现 Python 异步编程(Windows 环境)

一、环境搭建与依赖安装 1. 安装依赖包 pip install celery redis eventletcelery&#xff1a;异步任务队列框架。redis&#xff1a;作为消息中间件&#xff08;Broker&#xff09;和结果存储&#xff08;Backend&#xff09;。eventlet&#xff1a;用于 Windows 环境下的协程…...

Selenium Web自动化测试学习笔记(二)--八大元素定位

前置设置及代码 目录结构如下&#xff0c;将驱动器chromedriver.exe复制粘贴到此目录下&#xff0c;具体环境配置参考笔记一&#xff1a; Selenium Web自动化测试学习笔记&#xff08;一&#xff09;-CSDN博客 首先和笔记&#xff08;一&#xff09;一样导入一些包用于设置谷…...

如何设置飞书多维表格,可以在扣子平台上使用

扣子可以链接到飞书多维表格&#xff0c;但很多人不知道具体如何操作&#xff0c;今天给大家分享下操作流程。 大家好&#xff0c;我是涛涛&#xff0c;欢迎来到我的空间。因为需要管理员审核&#xff0c;所以最好有管理员的手机就在旁边方便操作。 (一) 进入应用中心 https…...

C++初阶-string类的简单应用

目录 1.仅仅反转字母 2.字符串中第一个唯一字符 3.字符串最后一个单词的长度 4.验证回文串 5.字符串相加 6.总结 1.仅仅反转字母 题目链接&#xff1a;https://leetcode.cn/problems/reverse-only-letters/description/ 在数据结构中我们学了一种方法叫做前后指针法&…...

企业数字化转型第二课:接受不完美(1/2)

一.引言 先看一组中国企业数字化转型相关的数据&#xff1a; 战略认知层面&#xff1a;92%中国企业将数字化纳入战略核心&#xff08;麦肯锡2023&#xff09;执行困境层面&#xff1a;63%企业转型首年遭遇重大挫折&#xff08;BCG 2024追踪&#xff09;价值释放周期&#xff1…...

【MCP】function call与mcp若干问题整理

前言&#xff1a;大模型里agent 的 funcation call 是什么概念 在大模型中&#xff0c;Agent是一个能够理解目标、进行自主规划&#xff0c;并利用可用工具&#xff08;包括Function Call&#xff09;来执行任务以达成目标的系统或程序。Function Call是大型语言模型提供的一项…...

QT聊天项目DAY09

1. 安装Redis 直接从老师的网盘下载 链接: https://pan.baidu.com/s/1v_foHZLvBeJQMePSGnp4Ow?pwdyid3 提取码: yid3 启动Redis服务看一下&#xff0c;启动成功了 .\redis-server.exe .\redis.windows.conf 启动客户端看一下 2. 配置redis库&#xff0c;调用API 编译一下 …...

JAVA八股文

一、JAVA基础 1.面向对象&#xff1a; 面向对象编程是一种以对象为核心的编程&#xff0c;通过封装、继承、多态和抽象管理代码。 1.封装&#xff1a;将数据&#xff08;属性&#xff09;和行为&#xff08;方法&#xff09;绑定在一个对象中&#xff0c;隐藏内部细节&#…...

『深夜_MySQL』数据库操作 字符集与检验规则

2.库的操作 2.1 创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [,create_specification]….]create_spcification:[DEFAULT] CHARACTER SET charset_nam[DEFAULT] COLLATE collation_name说明&#xff1a; 大写的表示关键字 …...

1688拍立淘搜索相似商品API接口概述,json数据示例参考

1688拍立淘搜索相似商品API接口概述 1688拍立淘是阿里巴巴1688平台提供的以图搜图功能&#xff0c;允许开发者通过上传商品图片或图片URL&#xff0c;快速检索1688平台上的相似商品。该接口基于图像识别技术&#xff0c;结合1688的海量商品库&#xff0c;为商家、采购商或开发…...

使用 Java 11 的 HttpClient 处理 RESTful Web 服务

在现代 Web 开发中,与 RESTful Web 服务交互是一项核心任务。Java 作为一种广泛使用的编程语言,提供了多种处理 HTTP 请求的方法。在 Java 11 之前,开发者通常使用 HttpURLConnection 或第三方库(如 Apache HttpClient)。然而,这些方法要么过于底层,要么需要额外依赖。J…...

学习笔记:黑马程序员JavaWeb开发教程(2025.3.30)

11.6 案例-文件上传-阿里云OSS-集成 从程序中获取URL给前端&#xff0c;前端显示图片 拿到URL&#xff0c;但是在浏览器里面是直接下载&#xff0c;展示可以使用html中的<image>标签 Spring环境下&#xff0c;不建议再去new对象&#xff0c;将其交给IOC容器管理&#xff…...

【MySQL】-- 联合查询

文章目录 1. 简介1.1 为什么要使用联合查询1.2 多表联合查询时MySQL内部是如何进行计算的 2. 内连接2.1 语法2.2 示例 3. 外连接3.1 语法3.2 示例 4. 自连接4.1 应用场景4.2 示例4.3 表连接练习 5. 子查询5.1 语法5.2 单行子查询5.3 多行子查询5.4 多列子查询5.5 在from 子句中…...

《C++ Templates》:有关const、引用、指针的一些函数模板实参推导的例子

1.T按值传递 最简单的模板例子&#xff1a; template<typename T> void func(T x) {std::cout << typeid(T).name() << std::endl;x 20;cout << x; } 这种情况下&#xff0c;T永远不会被推导成带顶层const或引用的类型 【顶层const即变量本身不能…...

【算法】随机快速排序和随机选择算法

文章目录 1、随机快速排序1.1 什么是随机快排1.2 随机快排的好处 2、随机选择算法 前言&#xff1a; 快速排序就是每次划分前&#xff0c;通过一种方法将一个基准值的位置确定好&#xff0c;再进入不同的部分重复相同的工作以此确定好每个值的位置以达到有序。如果你之前并不了…...

si551x时钟芯片linux下调试总结

目录 前言一、依赖文档、工具二、让芯片工作的流程三、以上步骤的SOC下代码实现 前言 本文总结调试SKYWORKS芯片厂商Si5512时钟芯片时的笔记&#xff0c;基于linux5.10.xxx内核&#xff0c;在arm64架构的SOC上验证&#xff1b; 一、依赖文档、工具 文档名说明下载链接Si5518…...

5.6-DAE实现

解决问题&#xff1a; 随机缺失​​&#xff08;实验室指标未检测&#xff09;​​系统性噪声​​&#xff08;设备测量误差&#xff09;​​类别不平衡​​&#xff08;健康/患病人群比例悬殊&#xff09; 思路&#xff1a;引入可控噪声 → 重建原始数据 实现步骤 ​​(1)…...

MCU怎么运行深度学习模型

Gitee仓库 git clone https://gitee.com/banana-peel-x/freedom-learn.git项目场景&#xff1a; 解决面试时遗留的问题&#xff0c;面试官提了两个问题&#xff1a;1.单片机能跑深度学习的模型吗&#xff1f; 2.为什么FreeRTOS要采用SVC去触发第一个任务&#xff0c;只用Pend…...

背单词软件开发英语app开发,超级单词表开发,河南数匠软件开发

在数字化教育浪潮席卷全球的当下&#xff0c;英语教育行业面临着教学模式创新与教学效率提升的双重挑战。如何借助技术力量&#xff0c;为学生提供更优质、更高效的英语学习体验&#xff0c;成为众多英语教育机构亟待解决的问题。河南数匠软件开发有限公司&#xff0c;作为专注…...

AI视觉质检的落地困境与突破路径

摘要 人工智能&#xff08;AI&#xff09;视觉质检技术凭借其在提升效率、降低成本和优化质量控制方面的巨大潜力&#xff0c;正成为现代制造业转型升级的关键驱动力。然而&#xff0c;尽管前景广阔&#xff0c;AI视觉质检在实际落地过程中仍面临诸多严峻挑战&#xff0c;主要…...

检测内存条好坏有工具,推荐几款内存检测工具

检测内存条的好坏其实很重要&#xff0c;这直接就关系到计算机是不是能够稳定的运行&#xff0c;也有一部分人就会关注内存检测的工具。你应该如何来选择的&#xff0c;不如看一下以下的这几个。 MemTest86是一个比较受到大家喜欢的内存检测工具&#xff0c;会支持各种类型&…...

认识tomcat(了解)

启动 1. windows版本 解压后&#xff0c;就能用&#xff0c;启动&#xff0c;是bin路径下的startup.bat , 关闭是ctrl C . 启动后&#xff0c;可以访问 http://127.0.0.1:8080。为什么是8080&#xff0c;因为如下这个配置文件 部署 将项目放置到webapps目录下&#xff0c;即…...

[20250507] AI边缘计算开发板行业调研报告 ​​(2024年最新版)​

[20250507] AI边缘计算开发板行业调研报告 ​​(2024年最新版&#xff09;​ 一、行业背景​​ 随着物联网设备激增与AI模型轻量化&#xff0c;边缘计算成为AI落地核心场景。AI边缘计算开发板&#xff08;Edge AI Board&#xff09;作为硬件载体&#xff0c;需满足​​低延迟…...

前端实现文件下载

目录 1.说明 2.示例--excel 3.示例--csv 1.说明 在开发中经常会出现下载csv或者excel文件&#xff0c;可以通过后端下载&#xff0c;也可以通过前端下载&#xff0c;如果在前端页面中可以直接获取到要下载的数据&#xff0c;可以通过前端下载的方式&#xff0c;更加高效便捷…...

深入理解Redis缓存与数据库不一致问题及其解决方案

什么是Redis缓存数据与数据库不一致 在现代应用中&#xff0c;Redis作为一种高速缓存系统&#xff0c;被广泛用于提升系统性能。Redis缓存数据与数据库不一致&#xff0c;指的是缓存中的数据与数据库中的数据不匹配&#xff0c;导致读取缓存时得到的不是最新或正确的数据。 R…...

六级阅读———2024.12卷一 仔细阅读2

文章 An awakening has been taking place in the physical world against the beauty model that has been dictated to us for years.But in the digital arena,social media determines what is considered beautiful.(51) The two opposing struggles are taking place i…...

【Python】字符串 转为 JSON 格式的注意事项

1. 字符串转json 我们如果使用sql存储json格式&#xff0c;要将json转为字符串才能转。 存入sql前&#xff0c;字典格式转json字符串可以用这个&#xff1a; Table_ [{"id": 1,"name": "Alice","task": 25,"work": &quo…...

镜像和容器的管理

一、镜像的管理 获取镜像并生成相关容器 # 拉取镜像 docker pull alpine # 默认是latest&#xff0c;也就是最新版本&#xff0c;也可指定版本&#xff08;在镜像名后边加“:版本号”&#xff09; # 或者 # 从主机中导入镜像到docker中 docker image load -i /test#生成容器 …...

Scrapy框架之Scrapyd部署及Gerapy分布式爬虫管理框架的使用

Scrapyd Scrapyd 是一个用于部署和运行 Scrapy 爬虫的服务器。 1.安装 Scrapyd服务端&#xff1a;pip install scrapyd Scrapyd客户端&#xff1a;pip install scrapyd-client 运行scrapyd 浏览器输入http://127.0.0.1:6800/ 2.配置 安装完成后&#xff0c;需要对 Scra…...

【uniapp】errMsg: “navigateTo:fail timeout“

项目场景&#xff1a; 在点击编辑的时候不能跳转的编辑的页面&#xff0c;然后直接报错errMsg: "navigateTo:fail timeout" 解决方案&#xff1a; 看看是否是出现了盒子的冒泡事件导致了两次调用跳转路径 tap.stop...

亿级流量系统架构设计与实战(五)

高并发写场景方案 1 : 数据分片之数据库分库分表 数据分片思想:可以将资源拆开分为多份,拆分的多份小的资源一起构成完整资源。 分库和分表 分库: 分库指的是将数据库拆分为多个小数据库,原来存储在单个数据库中的数据被分开存储到各个小数据库中。 分表:分表指的是将…...