【數據結構】二叉樹

在這里插入圖片描述

🐇

🔥博客主頁: 云曦
📋系列專欄:數據結構

💨吾生也有涯,而知也無涯
💛 感謝大家👍點贊 😋關注📝評論

文章目錄

  • 前言
  • 一、樹的概念及結構
    • 🌳1.1 樹的概念
    • 🌳1.4 樹和非樹
    • 🌳1.3 樹的表示
    • 🌳1.4 樹在實際中的運用
  • 二、二叉樹的概念及結構
    • 🌳2.1 二叉樹的概念
    • 🌳2.2 現實中的二叉樹
    • 🌳2.3 特殊的二叉樹
    • 🌳2.4 二叉樹的性質
    • 🌳2.5 二叉樹的存儲結構
      • ??2.5.1 順序存儲
      • ??2.5.2 鏈式存儲
  • 三、二叉樹鏈式結構及實現
    • 🌳3.1 二叉樹的遍歷
      • ??3.1.1 二叉樹前序、中序、后序遍歷的規則
      • ??3.1.2 前序遍歷
      • ??3.1.3 中序遍歷
      • ??3.1.4 后序遍歷
      • ??3.1.5 層序遍歷
    • 🌳3.2 二叉樹節點個數的統計
      • ??3.2.1 節點的個數
      • ??3.2.2 葉子節點的個數
    • 🌳3.3 二叉樹的創建和銷毀
      • ??3.3.2二叉樹的創建
      • ??3.3.2 二叉樹的銷毀
    • 🌳3.3 二叉樹接口測試
  • 四、完整代碼
    • 🌳<font color=Red>**4.1 BinaryTree.h**
    • 🌳<font color=Red>**4.2 BinaryTree.c**
    • 🌳<font color=Red>**4.3 test.c**

前言

在上期,講解完棧和隊列的實現后,本期迎來了新的知識,名為"二叉樹",希望大家能堅持的學習下去。

一、樹的概念及結構

🌳1.1 樹的概念

樹跟之前所學的順序表、鏈表等不相同,樹是一種非線性 的數據結構,它由n(n>=0)個有序節點組成一個具有層次關系的集合。把它叫作樹是因為它看起來像一顆倒掛的樹,也就是根朝上,而葉子朝下

  • 有一個特殊的節點,稱作根節點,根節點沒有前驅節點。
  • 除根節點外,其余結點被分成M(M>0)個互不相交的集T1T2、……、Tm,其中每一個集合Ti(1<= i<= m)又是一棵結構與樹類似的子樹。每棵子樹的根結點有且只有一個前驅,可以有0個或多個后繼
  • 因此樹是由遞歸定義
    在這里插入圖片描述
  • 樹的相關概念:
    在這里插入圖片描述
  1. 節點的度:一個節點含有的子樹的個數稱為該節點的度; 如上圖:A的為6
  2. 葉節點或終端節點:度為0的節點稱為葉節點; 如上圖:B、C、H、I…等節點為葉節點
  3. 非終端節點或分支節點:度不為0的節點; 如上圖:D、E、F、G…等節點為分支節點
  4. 雙親節點或父節點:若一個節點含有子節點,則這個節點稱為其子節點的父節點; 如上圖:A是B的父節點
  5. 孩子節點或子節點:一個節點含有的子樹的根節點稱為該節點的子節點; 如上圖:B是A的孩子節點
  6. 兄弟節點:具有相同父節點的節點互稱為兄弟節點; 如上圖:B、C是兄弟節點
  7. 樹的度:一棵樹中,最大的節點的度稱為樹的度; 如上圖:樹的度為6
  8. 節點的層次:從根開始定義起,根為第1層,根的子節點為第2層,以此類推;
  9. 樹的高度或深度:樹中節點的最大層次; 如上圖:樹的高度為4
  10. 堂兄弟節點:雙親在同一層的節點互為堂兄弟;如上圖:H、I互為兄弟節點
  11. 節點的祖先:從根到該節點所經分支上的所有節點;如上圖:A是所有節點的祖先
  12. 子孫:以某節點為根的子樹中任一節點都稱為該節點的子孫。如上圖:所有節點都是A的子孫
  13. 森林:由m(m>0)棵互不相交的樹的集合稱為森林;

🌳1.4 樹和非樹

注意:樹形結構中,子樹之間是沒有交集的,否則就不是樹形結構了。
在這里插入圖片描述

🌳1.3 樹的表示

孩子兄弟表示法:

typedef int DataType;typedef struct TreeNode
{struct TreeNode* firstchild;//第一個孩子節點struct TreeNode* nextbrother;//指向下一個兄弟節點DataType data;//節點的數據域
}TNode;

🌳1.4 樹在實際中的運用

用于表示文件系統的目錄數結構
在這里插入圖片描述

二、二叉樹的概念及結構

🌳2.1 二叉樹的概念

每一顆二叉樹是節點的一個有序的集合,該集合的特點是:

  1. 由一個根和左子樹、右子樹的組成的二叉樹。
  2. 該樹也有可能為空。

在這里插入圖片描述
從上圖可以看出:

  1. 二叉樹不存在大于2的節點。
  2. 二叉樹的子樹有左右之分,次序不能顛倒,因此二叉樹是有序樹。
  • 注意:對于任何一顆二叉樹都有可能由以下幾種復合而成的:
    在這里插入圖片描述

🌳2.2 現實中的二叉樹

在這里插入圖片描述

🌳2.3 特殊的二叉樹

  1. 滿二叉樹:一個二叉樹,如果每一個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。也就是說,如果一個二叉樹的層數為K,且結點總數是 ,則它就是滿二叉樹。
  2. 完全二叉樹:完全二叉樹是效率很高的數據結構,完全二叉樹是由滿二叉樹而引出來的。對于深度為K的,有n個結點的二叉樹,當且僅當其每一個結點都與深度為K的滿二叉樹中編號從1至n的結點一一對應時稱之為完全二叉樹。 要注意的是滿二叉樹是一種特殊的完全二叉樹。
    在這里插入圖片描述

🌳2.4 二叉樹的性質

  1. 若規定根節點的層數為1,則一棵非空二叉樹的第i層上最多有 個結點.
  2. 若規定根節點的層數為1,則深度為h的二叉樹的最大結點數是 .
  3. 對任何一棵二叉樹, 如果度為0其葉結點個數為 , 度為2的分支結點個數為 ,則有 = +1
  4. 若規定根節點的層數為1,具有n個結點的滿二叉樹的深度,h= . (ps: 是log以2為底,n+1為對數)
  5. 對于具有n個結點的完全二叉樹,如果按照從上至下從左至右的數組順序對所有節點從0開始編號,則對于序號為i的結點有:
  • 若i>0,i位置節點的雙親序號:(i-1)/2;i=0,i為根節點編號,無雙親節點
  • 若2i+1<n,左孩子序號:2i+1,2i+1>=n否則無左孩子
  • 若2i+2<n,右孩子序號:2i+2,2i+2>=n否則無右孩子

🌳2.5 二叉樹的存儲結構

??2.5.1 順序存儲

順序結果存儲就是用數組來存儲的,一般使用數組只適合表示完全二叉樹,因為不是完全二叉樹會有空間的浪費。而在使用時只有堆才會用數組來存儲,所以本期暫時不講解順序存儲。

??2.5.2 鏈式存儲

二叉樹的鏈式存儲結構是指,用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關系。 通常的方法是鏈表中每個結點由三個域組成,數據域和左右指針域,左右指針分別用來給出該結點左孩子和右孩子所在的鏈結點的存儲地址 。鏈式結構又分為二叉鏈和三叉鏈,當前我們使用的都是二叉鏈,三叉鏈會在講解紅黑樹時使用。

typedef char BTDataType;
//二叉鏈
typedef struct BinaryTreeNode
{struct BinaryTreeNode* left;//指向當前節點左孩子struct BinaryTreeNode* right;//指向當前節點右孩子BTDataType data;//當前節點值域
}BTNode;//三叉鏈
typedef struct BinaryTreeNode
{struct BinaryTreeNode* parents;//指向當前節點的雙親struct BinaryTreeNode* left;//指向當前節點左孩子struct BinaryTreeNode* right;//指向當前節點右孩子BTDataType data;//當前節點值域
}BTNode;

三、二叉樹鏈式結構及實現

結構的創建

typedef char BTDataType;typedef struct BinaryTreeNode
{struct BinaryTreeNode* left;//左子樹struct BinaryTreeNode* right;//右子樹BTDataType data;//節點的數據域
}BTNode;

🌳3.1 二叉樹的遍歷

學習二叉樹結構,最簡單的方式就是遍歷。所謂二叉樹遍歷(Traversal)是按照某種特定的規則,依次對二叉樹中的節點進行相應的操作,并且每個節點只操作一次

??3.1.1 二叉樹前序、中序、后序遍歷的規則

  • 前序遍歷:先訪問根節點,其次是左子樹,最后是右子樹(根 -> 左子樹 -> 右子樹)
  • 中序遍歷:先訪問左子樹,其次是根,最后是右子樹(左子樹 -> 根 -> 右子樹)
  • 后序遍歷:先訪問左子樹,其次是右子樹,最后是根(左子樹 -> 右子樹 -> 根)
  • 舉例:
    在這里插入圖片描述

由于被訪問的結點必是某子樹的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解釋為
根、根的左子樹和根的右子樹。NLR、LNR和LRN分別又稱為先根遍歷、中根遍歷和后根遍歷。

// 二叉樹前序遍歷
void PreOrder(BTNode* root);
// 二叉樹中序遍歷
void InOrder(BTNode* root);
// 二叉樹后序遍歷
void PostOrder(BTNode* root);

??3.1.2 前序遍歷

//二叉樹前序遍歷
void PrevOrder(BTNode* root)
{//根為空就返回if (root == NULL){printf("NULL ");return;}//根 -> 左子樹 -> 右子樹printf("%c ", root->data);//打印根PrevOrder(root->left);//遞歸左子樹PrevOrder(root->right);//遞歸右子樹
}

??3.1.3 中序遍歷

//二叉樹中序遍歷
void InOrder(BTNode* root)
{//根為空就返回if (root == NULL){printf("NULL ");return;}//左子樹 -> 根 -> 右子樹InOrder(root->left);//遞歸左子樹printf("%c ", root->data);//打印根InOrder(root->right);//遞歸右子樹
}

??3.1.4 后序遍歷

void PostOrder(BTNode* root)
{//根為空就返回if (root == NULL){printf("NULL ");return;}//左子樹 -> 右子樹 -> 根PostOrder(root->left);//遞歸左子樹PostOrder(root->right);//遞歸右子樹printf("%c ", root->data);//打印根
}

??3.1.5 層序遍歷

  • 前序中序后序其實也叫:深度優先遍歷
  • 而層序遍歷也叫作:廣度優先遍歷
  • 層序的核心思路就是:上層取出的時候,帶下一層進
  • 層序遍歷需要用到隊列來實現,而在C語言中沒有隊列的庫,那么還要實現一個隊列。但其實不需要實現,因為上一起已經實現過了,我們直接將源文件和頭文件復制粘貼到實現二叉樹的目錄下即可。(實現棧和隊列的鏈接)
  • 實現思路:在這里插入圖片描述
    注意:引用隊列的源文件和頭文件后,要在隊列的頭文件里聲明樹的結構體,然后將隊列結構data的類型改為樹的結構體指針類型
    在這里插入圖片描述
    且在二叉樹的頭文件里聲明隊列的頭文件時,要在樹的結構體后面聲明,因為在編譯是頭文件是張開向上找結構體的。
    在這里插入圖片描述
void LevelOrder(BTNode* root)
{//創建及初始化隊列Que q;QueueInit(&q);//空樹就不需要入隊列了//不是空樹就把根節點入隊列if (root){QueuePush(&q, root);}while (!QueueEmpty(&q)){//根節點出隊列BTNode* front = QueueFront(&q);QueuePop(&q);printf("%c ", front->data);//左子樹入隊列if (front->left){QueuePush(&q, front->left);}//右子樹入隊列if (front->right){QueuePush(&q, front->right);}}printf("\n");QueueDestroy(&q);
}

🌳3.2 二叉樹節點個數的統計

??3.2.1 節點的個數

int TreeSize(BTNode* root)
{return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}

看遞歸很繞的時候教大家一個方法,畫遞歸展開圖
函數遞歸展開圖

??3.2.2 葉子節點的個數

int LeafSize(BTNode* root)
{//根為空就返回0if (root == NULL){return 0;}//左右子樹為空,則返回1if (root->left == NULL && root->right == NULL){return 1;}//遞歸左子樹的葉子個數加遞歸右子樹的葉子個數return LeafSize(root->left) + LeafSize(root->right);
}

相當于節點個數功能的思路延伸,根為空返回0,左子樹與右子樹都為空返回1,最后遞歸左右子樹相加就得到了葉子節點的個數。

🌳3.3 二叉樹的創建和銷毀

??3.3.2二叉樹的創建

  • 二叉樹的創建思路是:通過前序遍歷的數組"ABD##E##C##"構建二叉樹
  • 只有前序是不可能構建出二叉樹的,但是在數組里用’#'表示NULL,這樣構建二叉樹就很容易了。
    在這里插入圖片描述
BTNode* BinaryTreeCreate(BTDataType* s, int* pi)
{//遇到'#',加加pi,然后返回NULLif (s[*pi] == '#'){(*pi)++;return NULL;}//malloc出來新的根節點BTNode* root = (BTNode*)malloc(sizeof(BTNode));if (root == NULL){perror("malloc fail");exit(-1);}root->data = s[*pi];(*pi)++;//遞歸構建左子樹root->left = BinaryTreeCreate(s, pi);//遞歸構建右子樹root->right = BinaryTreeCreate(s, pi);return root;
}

??3.3.2 二叉樹的銷毀

銷毀的含義依然是:把空間還給操作系統。
銷毀二叉樹很簡單,用后序遍歷的思路,把打印數據改成free(釋放)節點即可。

//思路就是:使用后序遍歷思路銷毀
void TreeDestroy(BTNode* root)
{//根為空時,直接返回if (root == NULL){return;}TreeDestroy(root->left);//遞歸左子樹TreeDestroy(root->right);//遞歸右子樹free(root);//釋放根節點root = NULL;
}

🌳3.3 二叉樹接口測試

int main()
{//構建樹char str[] = "ABD##E##C##";int i = 0;BTNode* root = BinaryTreeCreate(str, &i);//測試功能PrevOrder(root);printf("\n");InOrder(root);printf("\n");PostOrder(root);printf("\n");int ATree = TreeSize(root);printf("%d\n", ATree);//5int BTree = TreeSize(root->left);printf("%d\n", BTree);//3int ALeaf = LeafSize(root);printf("%d\n", ALeaf);//3LevelOrder(root);//A B C D ETreeDestroy(root);return 0;
}

在這里插入圖片描述

四、完整代碼

🌳4.1 BinaryTree.h

#pragma once#include<stdio.h>
#include<stdlib.h>//二叉樹
typedef char BTDataType;typedef struct BinaryTreeNode
{struct BinaryTreeNode* left;//左子樹struct BinaryTreeNode* right;//右子樹BTDataType data;//當前節點值域
}BTNode;#include "Queue.h"//二叉樹前序遍歷
void PrevOrder(BTNode* root);
//二叉樹中序遍歷
void InOrder(BTNode* root);
//二叉樹后序遍歷
void PostOrder(BTNode* root);
//二叉樹的層次
//核心思路:上層取出的時候,帶下一層進
void LevelOrder(BTNode* root);
//二叉樹節點的個數
int TreeSize(BTNode* root);
//二叉樹葉子的個數
int LeafSize(BTNode* root);
//二叉樹的銷毀
void TreeDestroy(BTNode* root);
//通過前序遍歷的數組"ABD##E##C##"構建二叉樹
BTNode* BinaryTreeCreate(BTDataType* s, int* pi);

🌳4.2 BinaryTree.c

#include "BinaryTree.h"void PrevOrder(BTNode* root)
{//根為空就返回if (root == NULL){printf("NULL ");return;}//根 -> 左子樹 -> 右子樹printf("%c ", root->data);//打印根PrevOrder(root->left);//遞歸左子樹PrevOrder(root->right);//遞歸右子樹
}void InOrder(BTNode* root)
{//根為空就返回if (root == NULL){printf("NULL ");return;}//左子樹 -> 根 -> 右子樹InOrder(root->left);//遞歸左子樹printf("%c ", root->data);//打印根InOrder(root->right);//遞歸右子樹
}void PostOrder(BTNode* root)
{//根為空就返回if (root == NULL){printf("NULL ");return;}//左子樹 -> 右子樹 -> 根PostOrder(root->left);//遞歸左子樹PostOrder(root->right);//遞歸右子樹printf("%c ", root->data);//打印根
}int TreeSize(BTNode* root)
{return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}int LeafSize(BTNode* root)
{//根為空就返回0if (root == NULL){return 0;}//左右子樹為空,則返回1if (root->left == NULL && root->right == NULL){return 1;}//遞歸左子樹的葉子個數加遞歸右子樹的葉子個數return LeafSize(root->left) + LeafSize(root->right);
}//核心思路:上層取出的時候,帶下一層進
void LevelOrder(BTNode* root)
{//創建及初始化隊列Que q;QueueInit(&q);//空樹就不需要入隊列了//不是空樹就把根節點入隊列if (root){QueuePush(&q, root);}while (!QueueEmpty(&q)){//根節點出隊列BTNode* front = QueueFront(&q);QueuePop(&q);printf("%c ", front->data);//左子樹入隊列if (front->left){QueuePush(&q, front->left);}//右子樹入隊列if (front->right){QueuePush(&q, front->right);}}printf("\n");QueueDestroy(&q);
}//思路就是:使用后序遍歷思路銷毀
void TreeDestroy(BTNode* root)
{//根為空時,直接返回if (root == NULL){return;}TreeDestroy(root->left);//遞歸左子樹TreeDestroy(root->right);//遞歸右子樹free(root);//釋放根節點root = NULL;
}BTNode* BinaryTreeCreate(BTDataType* s, int* pi)
{//遇到'#',加加pi,然后返回NULLif (s[*pi] == '#'){(*pi)++;return NULL;}//malloc出來新的根節點BTNode* root = (BTNode*)malloc(sizeof(BTNode));if (root == NULL){perror("malloc fail");exit(-1);}root->data = s[*pi];(*pi)++;//遞歸構建左子樹root->left = BinaryTreeCreate(s, pi);//遞歸構建右子樹root->right = BinaryTreeCreate(s, pi);return root;
}

🌳4.3 test.c

#include "BinaryTree.h"int main()
{//構建樹char str[] = "ABD##E##C##";int i = 0;BTNode* root = BinaryTreeCreate(str, &i);//測試功能PrevOrder(root);printf("\n");InOrder(root);printf("\n");PostOrder(root);printf("\n");int ATree = TreeSize(root);printf("%d\n", ATree);//5int BTree = TreeSize(root->left);printf("%d\n", BTree);//3int ALeaf = LeafSize(root);printf("%d\n", ALeaf);//3LevelOrder(root);TreeDestroy(root);return 0;
}

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

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

相關文章

簡單理解Python中的深拷貝與淺拷貝

I. 簡介 深拷貝會遞歸的創建一個完全獨立的對象副本&#xff0c;包括所有嵌套的對象&#xff0c;而淺拷貝只復制嵌套對象的引用&#xff0c;不復制嵌套對象本身。 簡單來說就是兩者都對原對象進行了復制&#xff0c;因此使用is運算符來比較新舊對象時&#xff0c;返回的都是F…

java把數字轉換成漢字 java 數字轉漢字

使用java將數字轉化為中文漢字_java數字轉中文_javaerly的博客-CSDN博客 package com.unicom.apartment.utils;public class NumUtil {public static String convert(int number) {if(number < 0){return "";}if(number 1){return "當天";}//數字對應的…

C#實現普通的語音播報

Windows有文字轉語音功能&#xff0c;C#提供了調用的類庫Interop.SpeechLib.dll 使用方法很簡單&#xff0c;在你的項目中添加Interop.SpeechLib.dll引用&#xff0c;在類中引用&#xff1a; using SpeechLib;這里提供一個CVoice類 幫助實現語音播報 public class CVoice{pri…

【5G 核心網】5G 多PDU會話錨點技術介紹

博主未授權任何人或組織機構轉載博主任何原創文章&#xff0c;感謝各位對原創的支持&#xff01; 博主鏈接 本人就職于國際知名終端廠商&#xff0c;負責modem芯片研發。 在5G早期負責終端數據業務層、核心網相關的開發工作&#xff0c;目前牽頭6G算力網絡技術標準研究。 博客…

Spring Boot(六十四):SpringBoot集成Gzip壓縮數據

1 實現思路 2 實現 2.1 創建springboot項目 2.2 編寫一個接口,功能很簡單就是傳入一個Json對象并返回 package com.example.demo.controller;import com.example.demo.entity.Advertising; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframewo…

LeetCode150道面試經典題-- 加一(簡單)

1.題目 給定一個由 整數 組成的 非空 數組所表示的非負整數&#xff0c;在該數的基礎上加一。 最高位數字存放在數組的首位&#xff0c; 數組中每個元素只存儲單個數字。 你可以假設除了整數 0 之外&#xff0c;這個整數不會以零開頭。 2.示例 示例 1&#xff1a; 輸入&am…

excel提示更新外部引用文件 這個提示能手動禁用

是的&#xff0c;你可以手動禁用 Excel 中的更新外部引用文件的提示。這些步驟可能因 Excel 版本而有所不同&#xff0c;以下是一般的步驟&#xff1a; 1. **打開 Excel**&#xff1a; 2. **進入“選項”**&#xff1a; - 在 Excel 中&#xff0c;點擊頂部菜單中的“文件”…

網絡通信原理傳輸層TCP三次建立連接(第四十八課)

ACK :確認號 。 是期望收到對方的下一個報文段的數據的第1個字節的序號,即上次已成功接收到的數據字節序號加1。只有ACK標識為1,此字段有效。確認號X+1SEQ:序號字段。 TCP鏈接中傳輸的數據流中每個字節都編上一個序號。序號字段的值指的是本報文段所發送的數據的第一個字節的…

「UG/NX」Block UI 面收集器FaceCollector

?博客主頁何曾參靜謐的博客??文章專欄「UG/NX」BlockUI集合??全部專欄「UG/NX」NX二次開發「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序設計「C/C+&#

LangChain手記 Question Answer 問答系統

整理并翻譯自DeepLearning.AILangChain的官方課程&#xff1a;Question Answer&#xff08;源代碼可見&#xff09; 本節介紹使用LangChian構建文檔上的問答系統&#xff0c;可以實現給定一個PDF文檔&#xff0c;詢問關于文檔上出現過的某個信息點&#xff0c;LLM可以給出關于該…

【vue】項目基礎環境搭建、css樣式重置與公用

nodejs環境 nodejs是當下前端工程化開發必不可少的環境, 使用 nodejs的 npm功能來管理依賴包 查看node 和 npm的版本 node -v #查看node版本npm -v #查看npm版本 git版本控制 git版本控制工具是目前最為流行的分布式版本管理工具,代碼的**提交, 檢出, 日志**, 都需要通過git完…

Matplotlib數據可視化(二)

目錄 1.rc參數設置 1.1 lines.linestype取值 1.2 lines.marker參數的取值 1.3 繪圖中文預設 1.4 示例 1.4.1 示例1 1.4.2 示例2 1.rc參數設置 利用matplotlib繪圖時為了讓繪制出的圖形更加好看&#xff0c;需要對參數進行設置rc參數設置。可以通過以下代碼查看matplotli…

C++11并發與多線程筆記(8) condition_variable、wait、notify_one、notify_all

C11并發與多線程筆記&#xff08;8&#xff09; condition_variable、wait、notify_one、notify_all 1、條件變量condition_variable、wait、notify_one、notify_all1.1 std::condition_variable1.2 wait()1.3 notify_one()1.4 notify_all() 2、深入思考 1、條件變量condition_…

JS內存泄漏

JS內存泄漏 1.意外的全局變量 全局變量的生命周期很長&#xff0c;直到頁面關閉&#xff0c;它都存活&#xff0c;所以全局變量上的內存一直都不會被回收 當全局變量使用不當&#xff0c;沒有及時回收&#xff08;手動賦值null&#xff09;&#xff0c;或者拼寫錯誤等將某個變…

[Machine Learning] decision tree 決策樹

&#xff08;為了節約時間&#xff0c;后面關于機器學習和有關內容哦就是用中文進行書寫了&#xff0c;如果有需要的話&#xff0c;我在目前手頭項目交工以后&#xff0c;用英文重寫一遍&#xff09; &#xff08;祝&#xff0c;本文同時用于比賽學習筆記和機器學習基礎課程&a…

【算法學習】兩數之和II - 輸入有序數組

題目描述 原題鏈接 給你一個下標從 1 開始的整數數組 numbers &#xff0c;該數組已按 非遞減順序排列 &#xff0c;請你從數組中找出滿足相加之和等于目標數 target 的兩個數。如果設這兩個數分別是 numbers[index1] 和 numbers[index2] &#xff0c;則 1 < index1 < …

Springboot MultipartFile文件上傳與下載

yml文件配置是否可以上傳及上傳附件大小 servlet:multipart:# 允許文件上傳enabled: true# 單個文件大小max-file-size: 20MB# 設置總上傳的文件大小max-request-size: 50MB /*** param files* param request* Description 上傳文件* Throws* Return java.util.List* Date 202…

南大通用數據庫(Gbase 8s) 創建UDR外部函數

一、在使用 date_format、from_unixtime、to_days、yearweek 函數時&#xff0c;Gbase 8s 數據庫不支持&#xff0c;可以使用創建 UDR 外部函數來實現 二、登錄命令控制臺或者使用 navicat 連接 Gbase 數據庫 這里使用 navicat &#xff0c;點擊新增連接選擇 PostGreSql 驅動…

動手學深度學習—卷積神經網絡LeNet(代碼詳解)

1. LeNet LeNet由兩個部分組成&#xff1a; 卷積編碼器&#xff1a;由兩個卷積層組成&#xff1b;全連接層密集塊&#xff1a;由三個全連接層組成。 每個卷積塊中的基本單元是一個卷積層、一個sigmoid激活函數和平均匯聚層&#xff1b;每個卷積層使用55卷積核和一個sigmoid激…

LeetCode--HOT100題(35)

目錄 題目描述&#xff1a;23. 合并 K 個升序鏈表&#xff08;困難&#xff09;題目接口解題思路1代碼解題思路2代碼 PS: 題目描述&#xff1a;23. 合并 K 個升序鏈表&#xff08;困難&#xff09; 給你一個鏈表數組&#xff0c;每個鏈表都已經按升序排列。 請你將所有鏈表合…