數據結構-非線性結構-二叉樹

概述

/**

?* 術語

?* 根節點(root node):位于二叉樹頂層的節點,沒有父節點。

?* 葉節點(leaf node):沒有子節點的節點,其兩個指針均指向 None 。

?* 邊(edge):連接兩個節點的線段,即節點引用(指針)。

?* 節點所在的層(level):從頂至底遞增,根節點所在層為 1 。

?* 節點的度(degree):節點的子節點的數量。在二叉樹中,度的取值范圍是 0、1、2 。

?* 二叉樹的高度(height):從根節點到最遠葉節點所經過的邊的數量。

?* 節點的深度(depth):從根節點到該節點所經過的邊的數量。

?* 節點的高度(height):從距離該節點最遠的葉節點到該節點所經過的邊的數量。

?*/

/**

?* 二叉樹遍歷:【前序、中序、后序】->【遞歸遍歷實現、非遞歸遍歷實現(棧實現)】、層次遍歷(隊列實現)

?* 二叉查找樹:具有性質如下的二叉樹:對于任一結點,如果它包含的數據元素為data,

?* ? ? 那么它的左子樹(如果非空)只包含小于data的元素,并且它的右子樹(如果非空)只包含大于或等于data的元素。

?* ? ? 中序遍歷二叉查找樹將會得到從小到大排列的結點序列。

?* 二叉線索樹:通過利用原本指向空子節點(即 NULL 指針)的空間來指向前驅或后繼節點,從而在遍歷時不需要使用額外的棧或遞歸。

?* ? ? 這種結構特別適用于那些需要頻繁遍歷而修改較少的應用場景。

?* 平衡二叉樹:AVL樹、紅黑樹

?* ? ? 關鍵特性:左右子樹高度差的絕對值不超過1

?* 完全二叉樹:主要用于實現堆(最大堆、最小堆)、哈夫曼編碼

?* ? ? 關鍵特性:按層次填充,每一層(除了最后一層)都完全填滿,最后一層從左到右依次填充,沒有間斷

?* 滿二叉樹:一種特殊的二叉樹,每一層的節點都完全填滿的二叉樹

?*/

/**

?* 遞歸遍歷

?* 前序遍歷:訪問順序為“根-左-右”。即先訪問根節點,然后依次遞歸遍歷左子樹和右子樹。

?* 中序遍歷:訪問順序為“左-根-右”。即先遞歸遍歷左子樹,然后訪問根節點,最后遞歸遍歷右子樹。

?* 后序遍歷:訪問順序為“左-右-根”。即先遞歸遍歷左子樹,然后遞歸遍歷右子樹,最后訪問根節點。

?*/

/**

?* 紅黑樹

?* 紅黑樹的一些基本特性和規則:

?* 每個節點要么是紅色,要么是黑色。

?* 根節點是黑色。

?* 所有葉子節點(NIL節點,通常不顯示在圖中)都是黑色的。

?* 如果一個節點是紅色,則它的兩個子節點都是黑色(即不能有兩個連續的紅色節點)。

?* 從任一節點到其每個葉子的所有路徑都包含相同數量的黑色節點。

?*/

?// 難點:遍歷、旋轉、刪除

common.h

#pragma once#define TRUE 1
#define FALSE 0// 定義節點數據類型
#define DATA_TYPE int

二叉樹插入、刪除、遞歸遍歷

BinaryTree.h

#pragma once#include "common.h"typedef struct Node
{DATA_TYPE data;struct Node *left;struct Node *right;
} Node;// 創建一個樹結點
static Node *newBinaryTreeNode(DATA_TYPE data)
{Node *node = malloc(sizeof(Node));node->data = data;node->left = NULL;node->right = NULL;return node;
}// 旋轉節點使二叉樹平衡
Node *rotate(Node *node);// 向二叉樹插入數據 平衡化重構
Node *insertNode(Node *T, DATA_TYPE data); // 遞歸void insertNode_root(DATA_TYPE data); // 插入、從root開始
void insertData(DATA_TYPE data);           // 迭代 不會選擇平衡化// 返回二叉樹結點數
int size();// 節點高度
int height(Node *T);// 前序、中序、后序遍歷
void preOrder(Node *T);
void inOrder(Node *T);
void postOrder(Node *T);
// 逆中序打印二叉樹
void printTree(Node *T, int level);// 判斷二叉樹是否平衡
int is_balanced(Node *T);// 查找數據是否在二叉樹中
int search_val(DATA_TYPE val);// 二叉樹的root結點
Node *getRoot();// 刪除節點
Node *delete_data(DATA_TYPE val);// 清空二叉樹
void clear();void test_binary_tree();

BinaryTree.c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>#include "BinaryTree.h"#define MAX_LINE 1024 // 定義二叉樹每行包含節點的最大個數 2的指數static Node *root = NULL;
static int node_size = 0;/*********************二叉樹平衡化*********************/
// 獲取平衡因子
static int balanceFactor(Node *node)
{if (node == NULL){return 0;}return height(node->left) - height(node->right);
}static Node *leftRotate(Node *node)
{Node *right = node->right;node->right = right->left;right->left = node;return right;
}static Node *rightRotate(Node *node)
{Node *left = node->left;node->left = left->right;left->right = node;return left;
}// 旋轉節點使二叉樹平衡
Node *rotate(Node *node)
{int bf = balanceFactor(node);if (bf > 1) // 左子樹{if (balanceFactor(node->left) >= 0) // 左子樹{return rightRotate(node);}else{// 先左旋再右旋node->left = leftRotate(node->left);return rightRotate(node);}}else if (bf < -1) // 右子樹{if (balanceFactor(node->right) <= 0) // 右子樹{return leftRotate(node);}else{node->right = rightRotate(node->right);return leftRotate(node);}}return node;
}
/*********************二叉樹平衡化*********************/// 插入數據,迭代方式 不會選擇平衡化
void insertData(DATA_TYPE data)
{if (root == NULL){root = malloc(sizeof(Node));root->data = data;root->left = NULL;root->right = NULL;node_size++;return;}Node *node = root;while (node){if (data < node->data){if (node->left == NULL){node->left = malloc(sizeof(Node));node->left->data = data;node->left->left = NULL;node->left->right = NULL;break;}else{node = node->left;}}else{if (node->right == NULL){node->right = malloc(sizeof(Node));node->right->data = data;node->right->left = NULL;node->right->right = NULL;break;}else{node = node->right;}}}node_size++;
}// 插入數據:遞歸方式 平衡化重構
Node *insertNode(Node *T, DATA_TYPE data)
{if (root == NULL){root = malloc(sizeof(Node));root->data = data;root->left = NULL;root->right = NULL;node_size++;return root;}if (T == NULL){Node *node = malloc(sizeof(Node));node->data = data;node->left = NULL;node->right = NULL;node_size++;return node;}if (data >= T->data){T->right = insertNode(T->right, data);}else{T->left = insertNode(T->left, data);}T = rotate(T);return T;
}void insertNode_root(DATA_TYPE data)
{root = insertNode(root, data);
}void preOrder(Node *T)
{if (T){printf("%d -> ", T->data);preOrder(T->left);preOrder(T->right);}
}
void inOrder(Node *T)
{if (T){inOrder(T->left);printf("%d -> ", T->data);inOrder(T->right);}
}
void postOrder(Node *T)
{if (T){postOrder(T->left);postOrder(T->right);printf("%d -> ", T->data);}
}// 采用逆中序和按層次縮進,是因為把打印結果按順時針方向旋轉90度就能呈現出正常的二叉樹形狀
void printTree(Node *T, int level)
{if (T){printTree(T->right, level + 1);for (int i = 0; i < level; i++){printf("     ");}printf("%d\n", T->data);printTree(T->left, level + 1);}
}int size()
{return node_size;
}int height(Node *T)
{if (T == NULL){return 0;}return __max(abs(height(T->left)), abs(height(T->right))) + 1;
}static void insertToRoot(DATA_TYPE data)
{insertNode(root, data);
}// 左右子樹高度差小于等于1
int is_balanced(Node *T)
{if (T == NULL){return TRUE; // 空樹被認為是平衡的}return abs(height(T->left) - height(T->right)) <= 1 && is_balanced(T->left) && is_balanced(T->right);
}static int search(Node *T, DATA_TYPE val)
{while (T){if (T->data == val){return TRUE;}T = (T->data > val) ? T->left : T->right;}return FALSE;
}int search_val(DATA_TYPE val)
{return search(root, val);
}Node *getRoot()
{return root;
}/*********************刪除元素*********************/
static Node *deleteLeftmost(Node *T)
{if (T->left == NULL){return T->right;}else{T->left = deleteLeftmost(T->left);return T;}
}static DATA_TYPE getLeftmost(Node *T)
{if (T->left == NULL){return T->data;}else{return getLeftmost(T->left);}
}static Node *deleteTopmost(Node *T)
{if (T->left == NULL){return T->right;}else if (T->right == NULL){return T->left;}else{T->data = getLeftmost(T->right);T->right = deleteLeftmost(T->right);return T;}
}static Node *delete(Node *T, DATA_TYPE val)
{if (T){if (T->data == val){node_size--;return deleteTopmost(T);}else if (val < T->data){T->left = delete(T->left, val);}else{T->right = delete(T->right, val);}}return T;
}Node *delete_data(DATA_TYPE val)
{return delete(root, val);
}void clear()
{free(root);root = NULL;node_size = 0;
}
/*********************刪除元素*********************/void test_binary_tree()
{printf("|***********************基礎操作***********************|\n");// insertData(4); // root// insertData(2); // root left child// insertData(1); // 2 left child// insertData(3); // 2 right child// insertData(6); // root right child// insertData(5); // 6 left child// insertData(7); // 6 right child// insertToRoot(4); // root// insertToRoot(2); // root left child// insertToRoot(1); // 2 left child// insertToRoot(3); // 2 right child// insertToRoot(6); // root right child// insertToRoot(5); // 6 left child// insertToRoot(7); // 6 right childinsertNode_root(4);insertNode_root(2);insertNode_root(1);insertNode_root(3);insertNode_root(6);insertNode_root(5);insertNode_root(7);insertNode_root(8);insertNode_root(9);insertNode_root(10);insertNode_root(11);insertNode_root(12);// insertNode_root(13);printf("逆中序打印:\n");printTree(root, 0);printf("結點數:%d\n", size());printf("是否包含[%d]:%d\n", 3, search_val(3));printf("是否包含[%d]:%d\n", 9, search_val(9));printf("前序遍歷:");preOrder(root);printf("\n");printf("中序遍歷:");inOrder(root);printf("\n");printf("后序遍歷:");postOrder(root);printf("\n");printf("逆中序打印:\n");printTree(root, 0);printf("\n");int len = height(root);printf("二叉樹高度:%d\n", len);printf("二叉樹是否平衡:%d\n", is_balanced(root));printf("測試刪除元素......");printf("\n");delete_data(4);printf("逆中序打印:\n");printTree(root, 0);printf("\n");delete_data(1);printf("逆中序打印:\n");printTree(root, 0);printf("\n");delete_data(5);printf("逆中序打印:\n");printTree(root, 0);clear();printf("\n");insertNode_root(10);insertNode_root(8);insertNode_root(15);insertNode_root(12);insertNode_root(19);insertNode_root(13); // 先右旋再左旋printf("逆中序打印:\n");printTree(root, 0);printf("|***********************平衡樹***********************|\n");
}

二叉樹層序遍歷

BinaryTreeLevelOrder.h

#include "BinaryTree.h"// 輔助隊列節點--用于層序遍歷
typedef struct QueueNode
{Node *data;struct QueueNode *next;
} QueueNode;/********************輔助隊列方法********************/
int is_queue_empty();
void enQueue(Node *T);
Node *deQueue();
/********************輔助隊列方法********************/// 二叉樹層序遍歷
DATA_TYPE **levelOrder(Node *T, int len /* 有多少層 */);void test_binary_tree_level_order();

BinaryTreeLevelOrder.c

#include <stdio.h>
#include <stdlib.h>#include "BinaryTreeLevelOrder.h"// #define col_len (height(getRoot()))// 層序遍歷輔助隊列結點數
static int queue_node_size = 0;
static QueueNode *Q = NULL;// 存儲二維數組每行有多少個列 即表示二叉樹每一層有多少個節點
static int *col;
static int col_len = 0;/********************輔助隊列方法********************/
int is_queue_empty()
{return queue_node_size == 0 || Q == NULL;
}
void enQueue(Node *T)
{if (Q == NULL){Q = malloc(sizeof(QueueNode));Q->data = T;Q->next = NULL;queue_node_size++;return;}QueueNode *q_node = Q;while (q_node->next != NULL){q_node = q_node->next;}q_node->next = malloc(sizeof(QueueNode));q_node->next->data = T;q_node->next->next = NULL;queue_node_size++;
}
Node *deQueue()
{Node *val = Q->data;Q = Q->next;queue_node_size--;return val;
}
/********************輔助隊列方法********************/DATA_TYPE **levelOrder(Node *T, int len /* 有多少層 */)
{// int (*arr)[MAX_LINE] = malloc(sizeof(*arr) * MAX_LINE);// DATA_TYPE *arr;DATA_TYPE **arr = malloc(sizeof(DATA_TYPE *) * len);col = malloc(sizeof(int) * len);enQueue(T);while (!is_queue_empty()){int curr_queue_size = queue_node_size; // 每行節點個數DATA_TYPE *per_line = malloc(sizeof(DATA_TYPE) * curr_queue_size);int index = 0;for (int i = 0; i < curr_queue_size; i++){Node *n = deQueue();per_line[index++] = n->data;// 從左到右收集節點if (n->left){enQueue(n->left);}if (n->right){enQueue(n->right);}}col[col_len] = index; // 每行有多少列arr[col_len] = per_line;col_len++;}return arr;
}void test_binary_tree_level_order()
{printf("|***********************層序遍歷***********************|\n");Node *root = getRoot();int len = height(root);DATA_TYPE **arr = levelOrder(root, len); // 鋸齒形數組 需要額外數據結構(數組或鏈表)保存每行列數// col_len 等于 len 即二叉樹的高度 即二叉樹有幾行for (int i = 0; i < col_len; i++){printf("第%d行有結點數: %d\t", i + 1, col[i]);}printf("\n");for (int i = 0; i < len; i++){int c = col[i];for (int j = 0; j < c; j++){int x = arr[i][j];printf("arr[%d][%d] = %d\t", i, j, x);}printf("\n");}
}

二叉樹非遞歸遍歷

BinaryTreeNonRecursiveOrder.h

#include "BinaryTree.h"// 輔助隊列節點--用于層序遍歷
typedef struct StackNode
{Node *data;struct StackNode *next;
} StackNode;/********************輔助隊列方法********************/
int is_stack_empty();
void push(Node *T);
Node *pop();
/********************輔助隊列方法********************/// 非遞歸前序遍歷
DATA_TYPE *non_recursive_pre_order(Node *root, int node_size);
// 非遞歸中序遍歷
DATA_TYPE *non_recursive_in_order(Node *root, int node_size);
// 非遞歸后序遍歷
DATA_TYPE *non_recursive_post_order(Node *root, int node_size);void test_binary_tree_non_recursive_order();

BinaryTreeNonRecursiveOrder.c

#include <stdio.h>
#include <stdlib.h>#include "BinaryTreeNonRecursiveOrder.h"static int stack_size = 0;
static StackNode *head = NULL;/********************輔助棧方法********************/static StackNode *newStackNode(Node *T)
{StackNode *node = malloc(sizeof(StackNode));node->data = T;node->next = NULL;return node;
}int is_stack_empty()
{return stack_size == 0;
}
void push(Node *T)
{if (head == NULL){head = newStackNode(T);stack_size++;return;}StackNode *node = newStackNode(T);node->next = head;head = node;stack_size++;
}
Node *pop()
{Node *node = head->data;head = head->next;stack_size--;return node;
}
/********************輔助棧方法********************/DATA_TYPE *non_recursive_pre_order(Node *root, int node_size)
{if (root == NULL){return NULL;}DATA_TYPE *result = malloc(sizeof(DATA_TYPE) * node_size);DATA_TYPE *p = result;while (root || !is_stack_empty()){if (root){*p++ = root->data;push(root);root = root->left;}else{root = pop();root = root->right;}}return result;
}
DATA_TYPE *non_recursive_in_order(Node *root, int node_size)
{if (root == NULL){return NULL;}DATA_TYPE *result = malloc(sizeof(DATA_TYPE) * node_size);DATA_TYPE *p = result;while (root || !is_stack_empty()){if (root){push(root);root = root->left;}else{root = pop();*p++ = root->data;root = root->right;}}return result;
}// 非遞歸后序遍歷
DATA_TYPE *non_recursive_post_order(Node *root, int node_size)
{if (root == NULL){return NULL;}DATA_TYPE *result = malloc(sizeof(DATA_TYPE) * node_size);DATA_TYPE *p = result;Node *pre = NULL;while (root || !is_stack_empty()){while (root){push(root);root = root->left;}root = pop();if (root->right == NULL || root->right == pre){*p++ = root->data;pre = root;root = NULL;}else{push(root);root = root->right;}}return result;
}static void printArray(DATA_TYPE *arr, int len)
{for (int i = 0; i < len; i++){printf("%d -> ", *arr++);}printf("\n");
}void test_binary_tree_non_recursive_order()
{printf("|***********************二叉樹非遞歸遍歷***********************|\n");Node *root = getRoot();int len = size(root); // 二叉樹結點數 用于動態內存分配時計算長度DATA_TYPE *arr = non_recursive_post_order(root, len);printf("非遞歸后序遍歷:");printArray(arr, len);arr = non_recursive_in_order(root, len);printf("非遞歸中序遍歷:");printArray(arr, len);arr = non_recursive_pre_order(root, len);printf("非遞歸前序遍歷:");printArray(arr, len);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/78969.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/78969.shtml
英文地址,請注明出處:http://en.pswp.cn/web/78969.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

芯片筆記 - 手冊參數注釋

芯片手冊參數注釋 基礎參數外圍設備USB OTG&#xff08;On-The-Go&#xff09;以太網存儲卡&#xff08;SD&#xff09;SDIO 3.0(Secure Digital Input/Output)GPIO&#xff08;General Purpose Input/Output 通用輸入/輸出接口&#xff09;ADC&#xff08;Analog to Digital C…

力扣94. 二叉樹的中序遍歷

94. 二叉樹的中序遍歷 給定一個二叉樹的根節點 root &#xff0c;返回 它的 中序 遍歷 。 示例 1&#xff1a; 輸入&#xff1a;root [1,null,2,3] 輸出&#xff1a;[1,3,2]示例 2&#xff1a; 輸入&#xff1a;root [] 輸出&#xff1a;[]示例 3&#xff1a; 輸入&#…

深度學習:AI為老年癡呆患者點亮希望之光

引言 隨著全球人口老齡化進程的加速&#xff0c;老年癡呆癥已成為嚴重威脅老年人健康和生活質量的公共衛生問題。據世界衛生組織統計&#xff0c;全球每 3 秒鐘就有 1 人被診斷為癡呆&#xff0c;預計到 2050 年&#xff0c;全球癡呆患者人數將從目前的約 5000 萬激增至 1.52 億…

拋物線法(二次插值法)

拋物線法簡介 拋物線法&#xff08;Quadratic Interpolation Method&#xff09;是一種用于一維單峰函數極值搜索的經典優化方法。該方法通過在區間內選取三個不同的點&#xff0c;擬合一條二次拋物線&#xff0c;并求取這條拋物線的極值點作為新的迭代點&#xff0c;從而逐步…

FreeRTOS如何檢測內存泄漏

在嵌入式系統中&#xff0c;內存資源通常非常有限&#xff0c;內存泄漏可能導致系統性能下降甚至崩潰。內存泄漏是指程序分配的內存未被正確釋放&#xff0c;逐漸耗盡可用內存。 FreeRTOS作為一種輕量級實時操作系統&#xff08;RTOS&#xff09;&#xff0c;廣泛應用于資源受限…

Mockoon 使用教程

文章目錄 一、簡介二、模擬接口1、Get2、Post 一、簡介 1、Mockoon 可以快速模擬API&#xff0c;無需遠程部署&#xff0c;無需帳戶&#xff0c;免費&#xff0c;跨平臺且開源&#xff0c;適合離線環境。 2、支持get、post、put、delete等所有格式。 二、模擬接口 1、Get 左…

如何進行APP安全加固

進行APP安全加固的關鍵在于代碼混淆、加密敏感數據、權限管理、漏洞掃描與修復。其中&#xff0c;代碼混淆能有效阻止逆向工程與篡改攻擊&#xff0c;提升應用的安全防護能力。通過混淆代碼&#xff0c;攻擊者難以輕易理解源代碼邏輯&#xff0c;從而降低被破解或攻擊的風險。 …

【C++】手搓一個STL風格的string容器

C string類的解析式高效實現 GitHub地址 有夢想的電信狗 1. 引言&#xff1a;字符串處理的復雜性 ? 在C標準庫中&#xff0c;string類作為最常用的容器之一&#xff0c;其內部實現復雜度遠超表面認知。本文將通過一個簡易仿照STL的string類的完整實現&#xff0c;揭示其設…

辰鰻科技朱越洋:緊扣時代契機,全力投身能源轉型戰略賽道

國家能源局于4月28日出臺的《關于促進能源領域民營經濟發展若干舉措的通知》&#xff08;以下簡稱《通知》&#xff09;&#xff0c;是繼2月民營企業座談會后深化能源領域市場化改革的關鍵政策&#xff0c;標志著民營經濟在“雙碳”目標引領下正式進入能源轉型的核心賽道。 自…

Vue實現不同網站之間的Cookie共享功能

前言 最近有小伙伴在聊天室中提到這么一個需求&#xff0c;就是說希望用戶在博客首頁中登錄了之后&#xff0c;可以跳轉到管理系統去發布文章。這個需求的話就涉及到了不同網站之間cookie共享的功能&#xff0c;那么咱們就來試著解決一下這個功能。 實現方式 1. 后端做中轉 …

在一臺服務器上通過 Nginx 配置實現不同子域名訪問靜態文件和后端服務

一、域名解析配置 要實現通過不同子域名訪問靜態文件和后端服務&#xff0c;首先需要進行域名解析。在域名注冊商或 DNS 服務商處&#xff0c;為你的兩個子域名 blog.xxx.com 和 api.xxx.com 配置 A 記錄或 CNAME 記錄。將它們的 A 記錄都指向你服務器的 IP 地址。例如&#x…

Opencv進階操作:圖像拼接

文章目錄 前言一、圖像拼接的原理1. 特征提取與匹配2. 圖像配準3. 圖像變換與投影4. 圖像融合5. 優化與后處理 二、圖像拼接的簡單實現&#xff08;案例實現&#xff09;1.引入庫2.定義cv_show()函數3.創建特征檢測函數detectAndDescribe()4.讀取拼接圖片5.計算圖片特征點及描述…

LLM 論文精讀(三)Demystifying Long Chain-of-Thought Reasoning in LLMs

這是一篇2025年發表在arxiv中的LLM領域論文&#xff0c;主要描述了長思維鏈 Long Chain-of-Thought 對LLM的影響&#xff0c;以及其可能的生成機制。通過大量的消融實驗證明了以下幾點&#xff1a; 與shot CoT 相比&#xff0c;long CoT 的 SFT 可以擴展到更高的性能上限&…

計算機網絡常識:緩存、長短連接 網絡初探、URL、客戶端與服務端、域名操作 tcp 三次握手 四次揮手

緩存&#xff1a; 緩存是對cpu&#xff0c;內存的一個節約&#xff1a;節約的是網絡帶寬資源 節約服務器的性能 資源的每次下載和請求都會造成服務器的一個壓力 減少網絡對資源拉取的延遲 這個就是瀏覽器緩存的一個好處 表示這個html頁面的返回是不要緩存的 忽略緩存 需要每次…

《構建社交應用用戶激勵引擎:React Native與Flutter實戰解析》

React Native憑借其與JavaScript和React的緊密聯系&#xff0c;為開發者提供了一個熟悉且靈活的開發環境。在構建用戶等級體系時&#xff0c;它能夠充分利用現有的前端開發知識和工具。通過將用戶在社交應用中的各種行為進行量化&#xff0c;比如發布動態的數量、點贊評論的次數…

接口自動化測試框架詳解(pytest+allure+aiohttp+ 用例自動生成)

&#x1f345; 點擊文末小卡片&#xff0c;免費獲取軟件測試全套資料&#xff0c;資料在手&#xff0c;漲薪更快 近期準備優先做接口測試的覆蓋&#xff0c;為此需要開發一個測試框架&#xff0c;經過思考&#xff0c;這次依然想做點兒不一樣的東西。 接口測試是比較講究效…

Linux-----文件系統

文件大家都知道&#xff0c;前面的我的博客課程也為大家解釋了關于文件的打開等&#xff0c;今天我們要談論的是 文件在沒被打開的時候在磁盤中的位置和找到它的方式。 畫圖為大家展示&#xff1a; 方便理解 我們從下面幾個方面入手&#xff1a; 1. 看看物理磁盤 2. 了解一…

C++ set替換vector進行優化

文章目錄 demo代碼解釋&#xff1a; 底層原理1. 二叉搜索樹基礎2. 紅黑樹的特性3. std::set 基于紅黑樹的實現優勢4. 插入操作5. 刪除操作6. 查找操作 demo #include <iostream> #include <set>int main() {// 創建一個存儲整數的std::setstd::set<int> myS…

如何巧妙解決 Too many connections 報錯?

1. 背景 在日常的 MySQL 運維中&#xff0c;難免會出現參數設置不合理&#xff0c;導致 MySQL 在使用過程中出現各種各樣的問題。 今天&#xff0c;我們就來講解一下 MySQL 運維中一種常見的問題&#xff1a;最大連接數設置不合理&#xff0c;一旦到了業務高峰期就會出現連接…

QT的布局和彈簧及其代碼解讀

this指的是真正的當前正在顯示的窗口 main函數&#xff1a; Widget w是生成了一個主窗口&#xff0c;QT Designer是在這個主窗口里塞組件 w.show()用來展示這個主窗口 頭文件&#xff1a; namespace Ui{class Widget;}中的class Widget和下面的class Widget不是一個東西 Ui…