基础数据结构--二叉树

一、二叉树的定义

二叉树是 n( n >= 0 ) 个结点组成的有限集合,这个集合要么是空集(当 n 等于 0 时),要么是由一个根结点和两棵互不相交的二叉树组成。其中这两棵互不相交的二叉树被称为根结点的左子树和右子树。

如图所示,2 是 1 的左子树,3 是 1 的右子树;同时,4 和 5 分别是 2 的左右子树,6 和 7 分别是 3 的左右子树。

二、二叉树的特点

二叉树是一种树,它有如下几个特征:

1)每个结点最多二棵子树,即每个结点的孩子结点个数为 0、1、2。

2)这两棵子树是有顺序的,分别叫:左子树 和 右子树,就像左手和右手一样,是不能颠倒的。

3)如果只有一棵子树的情况,也需要区分顺序,如图所示:

b 为 a 的左子树

c 为 a 的右子树

三、特殊二叉树

1、斜树

所有结点都只有左子树的二叉树,被称为左斜树,像这样:

所有结点都只有右子树的二叉树,被称为右斜树,像这样:

斜树有点类似线性表,所以线性表可以理解为一种特殊形式的树。

2、满二叉树

对于一棵二叉树,如果它的所有根结点和内部结点都存在左右子树,且所有叶子结点都在同一层,这样的树就是满二叉树,像这样:

满二叉树有如下几个特点:

1)叶子结点一定在最后一层

2)非叶子结点的度为 2

3)深度相同的二叉树中,满二叉树的结点个数最多,为 2^h-1(其中 h 代表树的深度)

3、完全二叉树

对一棵具有 n 个结点的二叉树,按照层序进行编号,如果编号 i 的结点和同样深度的满二叉树中的编号 i 的结点在二叉树中,位置完全相同则被称为 完全二叉树。

满二叉树一定是完全二叉树,而完全二叉树则不一定是满二叉树,完全二叉树有如下几个特点:

1)叶子结点只能出现在最下面两层

2)最下层的叶子结点,一定是集中在左边的连续位置,倒数第二层如果有叶子结点一定集中在右边的连续位置

3)如果某个结点度为 1,则只有左子树,即 不存在只有右子树 的情况

4)同样结点数的二叉树,完全二叉树的深度最小

如下图所示,就不是一棵完全二叉树,因为 5 号结点没有右子树,但是 6 号结点是有左子树的,不满足上述第 2 点。

四、二叉树的性质

以下性质对理解二叉树有很好的帮助,可以尝试自行证明。或许在后续遇到贪心相关问题时,需要用到这些证明。

1)二叉树的第 i(i >= 1)层上最多 2^(i-1) 个结点;

2)深度为 h 的二叉树至多 2^h - 1 个结点;

3)n 个结点的完全二叉树的深度为 floor(log2n) + 1(其中 floor(x) 代表对 x 取下整);

五、二叉树的顺序存储

二叉树的顺序存储就是指:利用顺序表对二叉树进行存储。结点的存储位置即顺序表的索引,能够体现结点之间的逻辑关系比如父结点和孩子结点之间的关系,左右兄弟结点之间的关系 等等。

1、完全二叉树

来看一棵完全二叉树,我们对它进行如下存储:

编号代表了顺序表索引的绝对位置,映射后如下

这里为了方便,我们把顺序表索引为 0 的位置给留空了。

这样一来,当知道某个结点在顺序表中的索引 x,就可以知道它左右儿子的索引分别为 2x 和 2x+1。反之,当知道某个结点的索引 x,也能知道它父结点的索引为 floor(x/2)。

2、非完全二叉树

对于非完全二叉树,只需要将对应不存在的结点设置为空即可

编号代表了顺序表索引的绝对位置,映射后如下

3、稀疏二叉树

对于较为稀疏的二叉树,就会有如下情况出现。这时候如果用这种方式进行存储,就比较浪费内存了

编号代表了顺序表索引的绝对位置,映射后如下:

下标0123456789101112
data-abcd--gh----

这种情况下,为了提升内存利用率,我们可以采用链表进行存储。

六、二叉树的链式存储

二叉树每个结点至多有两个孩子结点,所以对于每个结点设置一个 数据域(data) 和 两个 指针域(left 和 right) 即可。指针域 分别指向 左孩子结点 和 右孩子结点。

七、二叉树的遍历概念

二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点访问一次且仅被访问一次。

对于线性表的遍历,要么从头到尾,要么从尾到头,遍历方式较为单纯。但是树不一样,它的每个结点都有可能有两个孩子结点,所以遍历的顺序面临着不同的选择。

二叉树的常用遍历方法,有以下四种:前序遍历、中序遍历、后序遍历、层序遍历。

下标0123456789101112
data-abcd-efgh--i

八、二叉树的前序遍历

如果二叉树为空则直接返回,否则先访问根结点,再递归前序遍历左子树,再递归前序遍历右子树。前序遍历的结果如下:abdghcefi

九、二叉树的中序遍历

如果二叉树为空则直接返回,否则先递归中序遍历左子树,再访问根结点,再递归中序遍历右子树。中序遍历的结果如下:gdhbaecif。

十、二叉树的后序遍历

如果二叉树为空则直接返回,否则先递归后遍历左子树,再递归后序遍历右子树,再访问根结点。后序遍历的结果如下:ghdbeifca。

十一、二叉树的层序遍历

如果二叉树为空直接返回,否则依次从树的第一层开始,从上至下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。图中二叉树层序遍历的结果为:abcdefghi。

一、二叉树结点定义

#include <iostream>using namespace std;template < typename T >struct TreeNode {T val; // (1)TreeNode * left; // (2)TreeNode * right; // (3)TreeNode(): val(0), left(NULL), right(NULL) {} // (4)TreeNode(T x): val(x), left(NULL), right(NULL) {} // (5)};

(1) 定义了一个类型为 T 的成员变量 val,用于存储树节点的值。

(2) 定义了一个指向 TreeNode 类型的指针成员变量 left,用于存储左子结点的指针。

(3) 定义了一个指向 TreeNode 类型的指针成员变量 right,用于存储右子结点的指针。

(4) 定义了一个无参的构造函数,在创建树节点时将 val、left 和 right 都初始化为 NULL,并将 val 的值设置为 0。

(5) 定义了一个带参的构造函数,在创建树节点时将传入的参数赋值给 val,并将 left 和 right 都初始化为 NULL。

二、二叉树类的定义

template < typename T >class Tree {private:TreeNode < T > * nodes;TreeNode < T > * root;size_t nodeSize;TreeNode < T > * Create(T a[], int size, int nodeId, T nullNode); // (1)void visit(TreeNode < T > * node); // (2)void preOrder(TreeNode < T > * node); // (3)void inOrder(TreeNode < T > * node); // (4)void postOrder(TreeNode < T > * node); // (5)public:Tree(); // (6)Tree(int maxNodes); // (7)~Tree(); // (8)TreeNode < T > * GetTreeNode(int id); // (9)void CreateTree(T a[], int size, T nullNode); // (10)void preOrderTraversal(); // (11)void inOrderTraversal(); // (12)void postOrderTraversal(); // (13)};

(1) 这是一个模板函数声明,用于创建一个具有类型为 T 的树,是用于递归调用的。

(2) 这是一个成员函数声明,用于访问树结点(这里的实现就是打印结点的值)。

(3) 这是一个成员函数声明,用于前序遍历树结点。

(4) 这是一个成员函数声明,用于中序遍历树结点。

(5) 这是一个成员函数声明,用于后序遍历树结点。

(6) 这是构造函数声明,用于创建树结点池。

(7) 这是构造函数声明,用于创建一个具有最大结点数为 maxNodes 的树。

(8) 这是析构函数声明,用于销毁树对象并释放内存。

(9) 这是一个成员函数声明,用于获取指定编号的树结点。

(10) 这是一个成员函数声明,用于创建树。

(11) 这是一个成员函数声明,用于执行前序遍历。

(12) 这是一个成员函数声明,用于执行中序遍历。

(13) 这是一个成员函数声明,用于执行后序遍历。

三、二叉树的创建

template < typename T >Tree < T > ::Tree() {nodeSize = 100001;nodes = new TreeNode < T > [nodeSize];}template < typename T >Tree < T > ::Tree(int maxNodes) {nodeSize = maxNodes;nodes = new TreeNode < T > [nodeSize];}

这是两个不同参数的 Tree 的构造函数的实现,用来生成树的结点池。

四、二叉树的销毁

template<typename T>Tree<T>::~Tree() {delete[] nodes;}

当树销毁的时候,利用 delete 来清理结点池的内存空间。

五、获取二叉树的结点

template<typename T>TreeNode<T>* Tree<T>::GetTreeNode(int id) {return &nodes[id];}

通过 id 在 nodes 数组中索引,通过 O(1) 的时间复杂度内快速找到对应的树结点,然后再取地址并返回,就得到了 id 对应的树结点的地址。

六、访问二叉树的结点

template<typename T>void Tree<T>::visit(TreeNode<T> *node) {cout << node->val;}

用于访问传入的二叉树结点 node,为了体现二叉树的遍历,所以这里的实现是输出它的值。

七、二叉树的初始化

template < typename T >TreeNode < T > * Tree < T > ::Create(T a[], int size, int nodeId, T nullNode) {if (nodeId >= size || a[nodeId] == nullNode) {return NULL; // (1)}TreeNode < T > * nowNode = GetTreeNode(nodeId); // (2)nowNode -> val = a[nodeId]; // (3)nowNode -> left = Create(a, size, nodeId * 2, nullNode); // (4)nowNode -> right = Create(a, size, nodeId * 2 + 1, nullNode); // (5)return nowNode; // (6)}template < typename T >void Tree < T > ::CreateTree(T a[], int size, T nullNode) {root = Create(a, size, 1, nullNode); // (7)}

(1) 如果树结点编号 nodeId 大于等于数组大小 size,或者数组中编号为 nodeId 的元素的值等于空节点值 nullNode,则返回 NULL 表示创建一颗空树。

(2) 通过调用 GetTreeNode 方法获取编号为 nodeId 的树结点。

(3) 将数组中编号为 nodeId 的元素的值赋给当前树结点。

(4) 递归调用 Create 方法创建当前节点的左子结点,其中 nodeId 乘以 2 作为左子结点的编号。

(5) 递归调用 Create 方法创建当前节点的右子结点,其中 nodeId 乘以 2 加 1 作为右子结点的编号。

(6) 返回创建成功的树结点。

(7) 将根结点的指针设置为通过调用 Create 方法创建的树结点。

八、二叉树的前序遍历

template < typename T >void Tree < T > ::preOrder(TreeNode < T > * node) {if (node) {visit(node); // (1)preOrder(node -> left); // (2)preOrder(node -> right); // (3)}}template < typename T >void Tree < T > ::preOrderTraversal() {preOrder(root); // (4)}

(1) 调用 `visit` 函数访问当前树节点。

(2) 递归调用 `preOrder` 方法遍历当前节点的左子树。

(3) 递归调用 `preOrder` 方法遍历当前节点的右子树。

(4) 调用 `preOrder` 方法遍历根节点,即开始树的前序遍历。

九、二叉树的中序遍历

template < typename T >void Tree < T > ::inOrder(TreeNode < T > * node) {if (node) {inOrder(node -> left); // (1)visit(node); // (2)inOrder(node -> right); // (3)}}template < typename T >void Tree < T > ::inOrderTraversal() {inOrder(root); // (4)}

(1) 递归调用 `inOrder` 函数遍历当前节点的左子树。

(2) 调用 `visit` 函数访问当前树节点。

(3) 递归调用 `inOrder` 函数遍历当前节点的右子树。

(4) 调用 `inOrder` 函数遍历根节点,即开始树的中序遍历。

十、二叉树的后序遍历

template < typename T >void Tree < T > ::postOrder(TreeNode < T > * node) {if (node) {postOrder(node -> left); // (1)postOrder(node -> right); // (2)visit(node); // (3)}}template < typename T >void Tree < T > ::postOrderTraversal() {postOrder(root); // (4)}

(1) 递归调用 `postOrder` 函数遍历当前节点的左子树。

(2) 递归调用 `postOrder` 函数遍历当前节点的右子树。

(3) 调用 `visit` 函数访问当前树节点。

(4) 调用 `postOrder` 函数遍历根节点,即开始树的后序遍历。

十一、二叉树的完整源码

#include <iostream>using namespace std;template < typename T >struct TreeNode {T val;TreeNode * left;TreeNode * right;TreeNode(): val(0), left(NULL), right(NULL) {}TreeNode(T x): val(x), left(NULL), right(NULL) {}};template < typename T >class Tree {private:TreeNode < T > * nodes;TreeNode < T > * root;size_t nodeSize;TreeNode < T > * Create(T a[], int size, int nodeId, T nullNode);void visit(TreeNode < T > * node);void preOrder(TreeNode < T > * node);void inOrder(TreeNode < T > * node);void postOrder(TreeNode < T > * node);public:Tree();Tree(int maxNodes);~Tree();TreeNode < T > * GetTreeNode(int id);void CreateTree(T a[], int size, T nullNode);void preOrderTraversal();void inOrderTraversal();void postOrderTraversal();};template < typename T >Tree < T > ::Tree() {nodeSize = 100001;nodes = new TreeNode < T > [nodeSize];}template < typename T >Tree < T > ::Tree(int maxNodes) {nodeSize = maxNodes;nodes = new TreeNode < T > [nodeSize];}template < typename T >Tree < T > ::~Tree() {delete[] nodes;}template < typename T >TreeNode < T > * Tree < T > ::GetTreeNode(int id) {return & nodes[id];}template < typename T >void Tree < T > ::visit(TreeNode < T > * node) {cout << node -> val;}template < typename T >TreeNode < T > * Tree < T > ::Create(T a[], int size, int nodeId, T nullNode) {if (nodeId >= size || a[nodeId] == nullNode) {return NULL;}TreeNode < T > * nowNode = GetTreeNode(nodeId);nowNode -> val = a[nodeId];nowNode -> left = Create(a, size, nodeId * 2, nullNode);nowNode -> right = Create(a, size, nodeId * 2 + 1, nullNode);return nowNode;}template < typename T >void Tree < T > ::CreateTree(T a[], int size, T nullNode) {root = Create(a, size, 1, nullNode);}template < typename T >void Tree < T > ::preOrder(TreeNode < T > * node) {if (node) {visit(node);preOrder(node -> left);preOrder(node -> right);}}template < typename T >void Tree < T > ::preOrderTraversal() {preOrder(root);}template < typename T >void Tree < T > ::inOrder(TreeNode < T > * node) {if (node) {inOrder(node -> left);visit(node);inOrder(node -> right);}}template < typename T >void Tree < T > ::inOrderTraversal() {inOrder(root);}template < typename T >void Tree < T > ::postOrder(TreeNode < T > * node) {if (node) {postOrder(node -> left);postOrder(node -> right);visit(node);}}template < typename T >void Tree < T > ::postOrderTraversal() {postOrder(root);}int main(){const char nullNpde = '-';char a[15] = {nullNpde,'a','b','c','d',nullNpde,'e','f','g','h',nullNpde,nullNpde,nullNpde,nullNpde,'i'};Tree < char > T(15);T.CreateTree(a, 15, nullNpde);T.preOrderTraversal();cout << endl;T.inOrderTraversal();cout << endl;T.postOrderTraversal();cout << endl;return 0;}

题集

1. 单值二叉树

​ 2. 完全二叉树的节点个数

3. ​二叉树的前序遍历

​ 4. ​二叉树的中序遍历

​ 5. ​二叉树的后序遍历

​ 6. 翻转二叉树

​ 7. 从根到叶的二进制数之和

性质

单值二叉树

相同的树

对称二叉树

剑指 Offer 28. 对称的二叉树

二叉树的最大深度

剑指 Offer 55 - I. 二叉树的深度

二叉树的最小深度

完全二叉树的节点个数

二叉树的堂兄弟节点

另一棵树的子树

先序遍历

二叉树的前序遍历

找出克隆二叉树中的相同节点

二叉树展开为链表

二叉树的所有路径

从根到叶的二进制数之和

剑指 Offer II 045. 二叉树最底层最左边的值

剑指 Offer II 049. 从根节点到叶节点的路径数字之和

叶子相似的树

左叶子之和

路径总和

特定深度节点链表

最大二叉树

路径总和 II

统计二叉树中好节点的数目

中序遍历

二叉树的中序遍历

后序遍历

二叉树的后序遍历

二叉树的坡度

二叉树剪枝

剑指 Offer II 047. 二叉树剪枝

统计最高分的节点数目

层序遍历

二叉树的层序遍历

剑指 Offer 32 - I. 从上到下打印二叉树

最大层内元素和

剑指 Offer 32 - II. 从上到下打印二叉树 II

剑指 Offer 32 - III. 从上到下打印二叉树 III

二叉树的层序遍历 II

填充每个节点的下一个右侧节点指针 II

二叉树的层平均值

二叉树的锯齿形层序遍历

剑指 Offer II 045. 二叉树最底层最左边的值

找树左下角的值

剑指 Offer II 044. 二叉树每层的最大值

在每个树行中找最大值

二叉树的右视图

剑指 Offer II 046. 二叉树的右侧视图

在二叉树中分配硬币

构造 && 思维

合并二叉树

从前序与中序遍历序列构造二叉树

从中序与后序遍历序列构造二叉树

序列化和反序列化二叉搜索树

二叉树的序列化与反序列化

剑指 Offer 37. 序列化二叉树

剑指 Offer II 048. 序列化与反序列化二叉树

从先序遍历还原二叉树

LCA

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

剑指 Offer 68 - II. 二叉树的最近公共祖先

二叉搜索树的最近公共祖先

二叉树的最近公共祖先

首个共同祖先

具有所有最深节点的最小子树

最深叶节点的最近公共祖先

从二叉树一个节点到另一个节点每一步的方向

多低调:性质里的第四题:[剑指 Offer 28. 对称的二叉树]链接错了,应该是(力扣

wian:性质里的第六题:[剑指 Offer 55 - I. 二叉树的深度]链接错了,应该是力扣

多低调:性质里的倒数第三题:[完全二叉树的节点个数] 链接错了,应该是(力扣

Ivor:后序遍历的第3~4题:二叉树剪枝、剑指offerII二叉树剪枝 链接错了,应该是 力扣 、力扣

Ivor:后序遍历的第五题,统计最高分节点数目 链接错了,应该是 力扣

多低调:先序遍历里的第五题:[1022. 从根到叶的二进制数之和]链接错了,应该是(力扣)

多低调:先序遍历里的第七题:[剑指 Offer II 049. 从根节点到叶节点的路径数字之和]链接错了,应该是(力扣)

多低调:先序遍历里的第九题:【404. 左叶子之和】链接错了,应该是(力扣)

多低调:先序遍历里的第十题:【112. 路径总和】链接错了,应该是(力扣)

多低调:先序遍历里的倒数第二题:【113. 路径总和 II】链接错了,应该是(力扣)

低调:先序遍历里的最后一题:【1448. 统计二叉树中好节点的数目】链接错了,应该是(https://leetcode.cn/problems/count-good-nodes-in-b...)

多低调:中序遍历里的最后一题:【94. 二叉树的中序遍历】链接错了,应该是(力扣)

切糕子:层序遍历里的第二题:[剑指 Offer 32 - I. 从上到下打印二叉树]链接错了,应该是(. - 力扣(LeetCode))

切糕子:层序遍历里的第九题:[二叉树的锯齿形层序遍历]链接错了,应该是(. - 力扣(LeetCode))

切糕子:层序遍历里的倒数第二题:[剑指 Offer II 046. 二叉树的右视图]链接错了,应该是(. - 力扣(LeetCode))

切糕子:构造 && 思维里的第四题:[序列化和反序列化二叉搜索树]链接错了,应该是(. - 力扣(LeetCode))

切糕子:构造 && 思维里的倒数第一题:[从先序遍历还原二叉树]链接错了,应该是(. - 力扣(LeetCode))

切糕子:LCA里的第一题:[剑指 Offer 68 - I. 二叉搜索树的最近公共祖先]链接错了,应该是(. - 力扣(LeetCode))

切糕子:LCA里的第三题:[二叉搜索树的最近公共祖先]链接错了,应该是(. - 力扣(LeetCode))

切糕子:LCA里的第四题:[二叉树的最近公共祖先]链接错了,应该是(. - 力扣(LeetCode))

切糕子:LCA里的倒数第三题:[具有所有最深节点的最小子树]链接错了,应该是(. - 力扣(LeetCode))

切糕子:LCA里的倒数第二题:[最深叶节点的最近公共祖先]链接错了,应该是(. - 力扣(LeetCode))

切糕子:LCA里的倒数第一题:[从二叉树一个节点到另一个节点每一步的方向]链接错了,应该是(. - 力扣(LeetCode))

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

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

相关文章

shell学习变量(二)

这里写目录标题 一、概念1、环境变量2、本地变量3、系统变量 二、环境变量三、本地变量四、系统变量五、定义变量规则1、命名规则2、定义方式3、unset命令&#xff1a;删除变量 一、概念 1、环境变量 环境变量指的是再当前进程有效&#xff0c;并且能够被子进程调用&#xff…

自动驾驶3D目标检测综述(六)

停更了好久终于回来了&#xff08;其实是因为博主去备考期末了hh&#xff09; 这一篇接着&#xff08;五&#xff09;的第七章开始讲述第八章的内容。第八章主要介绍的是三维目标检测的高效标签。 目录 第八章 三维目标检测高效标签 一、域适应 &#xff08;一&#xff09;…

如何恢复永久删除的PPT文件?查看数据恢复教程!

可以恢复永久删除的PPT文件吗&#xff1f; Microsoft PowerPoint应用程序是一种应用广泛的演示程序&#xff0c;在人们的日常生活中经常使用。商人、官员、学生等在学习和工作中会使用PowerPoint做报告和演示。PowerPoint在人们的学习和工作生活中占主导地位&#xff0c;每天都…

四大自平衡树对比:AVL树、红黑树、B树与B+树

AVL树、红黑树、B树和B树的对比与应用场景 树系列相关文章&#xff08;置顶&#xff09; 1、从链表到平衡树&#xff1a;二叉查找树的退化与优化 2、自平衡二叉查找树&#xff1a;如何让二叉查找树始终保持高效 3、AVL树入门&#xff1a;理解自平衡二叉查找树的基础 4、红黑树全…

IOS safari 播放 mp4 遇到的坎儿

起因 事情的起因是调试 IOS 手机下播放服务器接口返回的 mp4 文件流失败。对于没调试过移动端和 Safari 的我来说着实费了些功夫&#xff0c;网上和AI也没有讲明白。好在最终大概理清楚了&#xff0c;在这里整理出来供有缘人参考。 问题 因为直接用 IOS 手机的浏览器打开页面…

Kubernetes Gateway API-2-跨命名空间路由

1 跨命名空间路由 Gateway API 具有跨命名空间路由的核心支持。当多个用户或团队共享底层网络基础设施时,这很有用,但必须对控制和配置进行分段,以尽量减少访问和容错域。 Gateway 和 Route(HTTPRoute,TCPRoute,GRPCRoute) 可以部署到不同的命名空间中,路由可以跨命名空间…

第十六届蓝桥杯模拟赛(第一期)(C语言)

判断质因数 如果一个数p是个质数&#xff0c;同时又是整数a的约数&#xff0c;则p称为a的一个质因数。 请问2024有多少个质因数。 了解 约数&#xff0c;又称因数。整数a整除整数b&#xff0c;b为a的因数&#xff08;约数&#xff09;质数&#xff0c;又称素数。只有1和它本身两…

AI安全的挑战:如何让人工智能变得更加可信

引言 随着人工智能&#xff08;AI&#xff09;技术在各个领域的广泛应用&#xff0c;尤其是在医疗、金融、自动驾驶和智能制造等行业&#xff0c;AI正在重塑我们的工作和生活方式。从提高生产效率到实现个性化服务&#xff0c;AI带来了前所未有的便利。然而&#xff0c;在享受这…

TiDB 的MPP架构概述

MPP架构介绍&#xff1a; 如图&#xff0c;TiDB Server 作为协调者&#xff0c;首先 TiDB Server 会把每个TiFlash 拥有的region 会在TiFlash上做交换&#xff0c;让表连接在一个TiFlash上。另外 TiFlash会作为计算节点&#xff0c;每个TiFlash都负责数据交换&#xff0c;表连接…

springboot499基于javaweb的城乡居民基本医疗信息管理系统(论文+源码)_kaic

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自古…

【SQL Server】教材数据库(1)

1 利用sql建立教材数据库&#xff0c;并定义以下基本表&#xff1a; 学生&#xff08;学号&#xff0c;年龄&#xff0c;性别&#xff0c;系名&#xff09; 教材&#xff08;编号&#xff0c;书名&#xff0c;出版社编号&#xff0c;价格&#xff09; 订购&#xff08;学号…

RT-Thread中堆和栈怎么跟单片机内存相联系

现在RT-ThreadMCU的应用方式越来越普遍&#xff0c;RT-Thread需要配置MCU中的RAM到的系统中&#xff0c;进入系统内存管理&#xff0c;才能提供给基于实时系统的应用程序使用&#xff0c;比如给应用程序提供malloc、free等函数调用功能。在嵌入式软件开发中&#xff0c;我们经常…

Linux硬盘分区 --- fdisk命令MBR分区、添加硬盘、lsblk命令

一、MBR分区 如果想对硬盘进行分区可以使用“ fdisk ”命令&#xff0c;它会采用MBR格式将硬盘进行分区。MBR是传统的分区机制&#xff0c;支持 32 位和 64 位系统&#xff0c;最多只能创建 4 个主分区&#xff0c;或者 3 个主分区和 1 个扩展分区&#xff0c;只支持不超过 2T…

GraphRAG 框架哪家强?选择最适合你智能问答系统的框架

GraphRAG 框架哪家强&#xff1f;选择最适合你智能问答系统的框架 点击进入&#xff1a;GraphRAG系列文章-Nano-GraphRAG&#xff1a;打造轻量级医疗诊断助手 点击进入&#xff1a;GraphRAG系列文章-突破传统知识管理瓶颈&#xff1a;LlamaIndex GraphRAG 让企业知识问答更智能…

day-102 二进制矩阵中的最短路径

思路 BFS 解题过程 从起点依次向八个方向尝试&#xff08;之后也一样&#xff09;&#xff0c;如果某个位置在矩阵内且值为0且没有访问过&#xff0c;将其添加到一个队列中&#xff0c;依次类推&#xff0c;直到到达出口 Code class Solution {public int shortestPathBinar…

vue3学习笔记(10)-$subscribe,store组合式写法

1.$subscribe订阅&#xff0c;监视vuex中数据得修改 2.localStorage里面穿的都是字符串&#xff0c;关掉浏览器数据还在 只能获取字符串&#xff0c;用ts语法写明&#xff0c;作为字符串使用 3.组合式写法

WAP短信格式解析及在Linux下用C语言实现

WAP短信格式解析及在Linux下用C语言实现 一、引言二、WAP短信格式概述三、WAP短信头的内容四、UDHI与WAP短信体的关系五、在Linux下用C语言解析WAP短信头及短信体内容一、引言 在移动通信领域,短信作为一种古老却稳定的通信方式,一直扮演着重要的角色。随着技术的发展,短信…

从 Coding (Jenkinsfile) 到 Docker:全流程自动化部署 Spring Boot 实战指南(简化篇)

前言 本文记录使用 Coding (以 Jenkinsfile 为核心) 和 Docker 部署 Springboot 项目的过程&#xff0c;分享设置细节和一些注意问题。 1. 配置服务器环境 在实施此过程前&#xff0c;确保服务器已配置好 Docker、MySQL 和 Redis&#xff0c;可参考下列链接进行操作&#xff1…

华为消费级QLC SSD来了

近日&#xff0c;有关消息显示&#xff0c;华为的消费级SSD产品线&#xff0c;eKitStor Xtreme 200E系列&#xff0c;在韩国一家在线零售商处首次公开销售&#xff0c;引起了业界的广泛关注。 尽管华为已经涉足服务器级别的SSD制造多年&#xff0c;但直到今年6月才正式推出面向…

visual studio连接sql server数据库

目录 1、为什么要建立连接2、在sql server中建立数据库3、visual studio连接sql server数据库4、学生信息管理系统页面布局5、添加事件逻辑 5.1 页面跳转5.2 读取学生信息5.3 查询学生信息5.4 修改学生信息5.5 删除学生信息5.6 添加学生信息 bilibili演示视频 github源码 1、…