【數據結構初階】--二叉樹(五)

?🔥個人主頁:@草莓熊Lotso

🎬作者簡介:C++研發方向學習者

📖個人專欄:?《C語言》?《數據結構與算法》《C語言刷題集》《Leetcode刷題指南》

??人生格言:生活是默默的堅持,毅力是永久的享受。??

前言: 通過前面幾篇博客我們已經完成了前中后序的接口實現,我們現在開始需要進行其它二叉樹常用方法的實現,比如二叉樹節點個數,葉子節點個數等。還是和之前一樣分部分實現,最后再展示全部的代碼。


目錄

一.求二叉樹節點個數

代碼實現:?

test.c:?

二.求二叉樹葉子節點個數

代碼實現:

test.c:?

?三.求二叉樹第k層節點個數

代碼實現:?

test.c:?

?四.求二叉樹的深度/高度

?代碼實現:

test.c:?

?五.二叉樹查找值為x的節點

代碼實現:

test.c:

?六.二叉樹的銷毀?

代碼實現:

?七.代碼展現

Tree.h:

Tree.c:

test.c:


一.求二叉樹節點個數

--我們先來實現一個求二叉樹的節點個數的接口,在正式開始之前我們先把上次寫的代碼里的test.c中創建樹的代碼優化一下,這樣方便后續操作

#include"Tree.h"BTNode* buyNode(char x)
{BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->data = x;newnode->left = newnode->right = NULL;return newnode;
}
BTNode* CreateTree()
{BTNode* nodeA = buyNode('A');BTNode* nodeB = buyNode('B');BTNode* nodeC = buyNode('C');BTNode* nodeD = buyNode('D');BTNode* nodeE = buyNode('E');BTNode* nodeF = buyNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->left = nodeE;nodeC->right = nodeF;return nodeA;
}void test1()
{BTNode* root = CreateTree();//前中后序遍歷//PreOrder(root);//InOrder(root);//PostOrder(root);
}int main()
{test1();return 0;
}

--優化完之后,我們就可以開始實現求二叉樹節點個數的接口了?

  • ?二叉樹結點個數=根節點+左子樹結點個數+右子樹結點個數

代碼實現:?

// 二叉樹結點個數=根節點+左子樹節點個數+右子樹節點個數
int BinaryTreeSize(BTNode* root)
{if (root == NULL){return 0;}return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}

    圖示如下:

    test.c:?

    #include"Tree.h"BTNode* buyNode(char x)
    {BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->data = x;newnode->left = newnode->right = NULL;return newnode;
    }
    BTNode* CreateTree()
    {BTNode* nodeA = buyNode('A');BTNode* nodeB = buyNode('B');BTNode* nodeC = buyNode('C');BTNode* nodeD = buyNode('D');BTNode* nodeE = buyNode('E');BTNode* nodeF = buyNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->left = nodeE;nodeC->right = nodeF;return nodeA;
    }void test1()
    {BTNode* root = CreateTree();//前中后序遍歷//PreOrder(root);//InOrder(root);//PostOrder(root);//二叉樹結點個數printf("Size: %d\n", BinaryTreeSize(root));
    }int main()
    {test1();return 0;
    }

    --測試完成,打印出來沒有問題,退出碼為0?


    二.求二叉樹葉子節點個數

    --二叉樹的葉子節點就是左右孩子都為空的節點

    • 二叉樹葉子節點個數=左子樹葉子節點個數+右子樹葉子節點個數

    代碼實現:

    // 二叉樹葉子結點個數=左子樹葉子節點個數+右子樹節點個數
    int BinaryTreeLeafSize(BTNode* root)
    {if (root == NULL){return 0;}//判斷是否為葉子節點(沒有左右孩子)if (root->left == NULL && root->right == NULL){return 1;}return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
    }

    圖示如下:?

    test.c:?

    #include"Tree.h"BTNode* buyNode(char x)
    {BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->data = x;newnode->left = newnode->right = NULL;return newnode;
    }
    BTNode* CreateTree()
    {BTNode* nodeA = buyNode('A');BTNode* nodeB = buyNode('B');BTNode* nodeC = buyNode('C');BTNode* nodeD = buyNode('D');BTNode* nodeE = buyNode('E');BTNode* nodeF = buyNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->left = nodeE;nodeC->right = nodeF;return nodeA;
    }void test1()
    {BTNode* root = CreateTree();//前中后序遍歷//PreOrder(root);//InOrder(root);//PostOrder(root);//二叉樹結點個數printf("Size: %d\n", BinaryTreeSize(root));//二叉樹葉子結點個數printf("LeafSize: %d\n", BinaryTreeLeafSize(root));
    }int main()
    {test1();return 0;
    }

    --測試完成,打印沒有問題,退出碼為0


    ?三.求二叉樹第k層節點個數

    --當k==1時當前節點就是第k層節點

    • 二叉樹第k層節點個數=左子樹第k-1層節點個數+右子樹第k-1層節點個數

    代碼實現:?

    // 二叉樹第k層節點個數=左子樹第K-1層節點個數+右子樹第k-1層節點個數
    int BinaryTreeLevelKSize(BTNode* root, int k)
    {if (root == NULL){return 0;}//判斷是否為第k層if (k == 1){return 1;}//每次注意要k-1return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
    }

    圖示如下:?

    test.c:?

    #include"Tree.h"BTNode* buyNode(char x)
    {BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->data = x;newnode->left = newnode->right = NULL;return newnode;
    }
    BTNode* CreateTree()
    {BTNode* nodeA = buyNode('A');BTNode* nodeB = buyNode('B');BTNode* nodeC = buyNode('C');BTNode* nodeD = buyNode('D');BTNode* nodeE = buyNode('E');BTNode* nodeF = buyNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->left = nodeE;nodeC->right = nodeF;return nodeA;
    }void test1()
    {BTNode* root = CreateTree();//前中后序遍歷//PreOrder(root);//InOrder(root);//PostOrder(root);//二叉樹結點個數printf("Size: %d\n", BinaryTreeSize(root));//二叉樹葉子結點個數printf("LeafSize: %d\n", BinaryTreeLeafSize(root));//第k層節點個數printf("K Size: %d\n", BinaryTreeLevelKSize(root,3));
    }int main()
    {test1();return 0;
    }

    --測試完成,打印沒有問題,退出碼為0


    ?四.求二叉樹的深度/高度

    • 二叉樹的高度=根節點+max(左子樹的高度,右子樹的高度)

    ?代碼實現:

    //二叉樹的深度/高度=根節點+max(左子樹高度,右子樹高度)
    int BinaryTreeDepth(BTNode* root)
    {if (root == NULL){return 0;}int leftdepth = BinaryTreeDepth(root->left);int rightdepth = BinaryTreeDepth(root->right);return 1 + (leftdepth > rightdepth ? leftdepth : rightdepth);
    }

    圖示如下:

    test.c:?

    #include"Tree.h"BTNode* buyNode(char x)
    {BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->data = x;newnode->left = newnode->right = NULL;return newnode;
    }
    BTNode* CreateTree()
    {BTNode* nodeA = buyNode('A');BTNode* nodeB = buyNode('B');BTNode* nodeC = buyNode('C');BTNode* nodeD = buyNode('D');BTNode* nodeE = buyNode('E');BTNode* nodeF = buyNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->left = nodeE;nodeC->right = nodeF;return nodeA;
    }void test1()
    {BTNode* root = CreateTree();//前中后序遍歷//PreOrder(root);//InOrder(root);//PostOrder(root);//二叉樹結點個數printf("Size: %d\n", BinaryTreeSize(root));//二叉樹葉子結點個數printf("LeafSize: %d\n", BinaryTreeLeafSize(root));//第k層節點個數printf("K Size: %d\n", BinaryTreeLevelKSize(root,3));//二叉樹的深度/高度printf("Depth: %d\n", BinaryTreeDepth(root));
    }int main()
    {test1();return 0;
    }

    --測試完成,打印沒有問題,退出碼為0


    ?五.二叉樹查找值為x的節點

    --遞歸查找,找到了就返回當前節點,如果是在左子樹中找到就直接返回,沒找到繼續來到右子樹找,最好都沒找到就返回NULL

    代碼實現:

    // 二叉樹查找值為x的結點
    BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
    {if (root == NULL){return NULL;}if (root->data == x){return root;}BTNode*leftroot = BinaryTreeFind(root->left, x);//如果leftroot不為空就是找到了直接返回if (leftroot){return leftroot;}//沒找到就繼續右子樹找BTNode* rightroot = BinaryTreeFind(root->right, x);if (rightroot){return rightroot;}//都沒找到就返回空return NULL;
    }

    圖示如下:?

    test.c:

    #include"Tree.h"BTNode* buyNode(char x)
    {BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->data = x;newnode->left = newnode->right = NULL;return newnode;
    }
    BTNode* CreateTree()
    {BTNode* nodeA = buyNode('A');BTNode* nodeB = buyNode('B');BTNode* nodeC = buyNode('C');BTNode* nodeD = buyNode('D');BTNode* nodeE = buyNode('E');BTNode* nodeF = buyNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->left = nodeE;nodeC->right = nodeF;return nodeA;
    }void test1()
    {BTNode* root = CreateTree();//前中后序遍歷//PreOrder(root);//InOrder(root);//PostOrder(root);//二叉樹結點個數printf("Size: %d\n", BinaryTreeSize(root));//二叉樹葉子結點個數printf("LeafSize: %d\n", BinaryTreeLeafSize(root));//第k層節點個數printf("K Size: %d\n", BinaryTreeLevelKSize(root,3));//二叉樹的深度/高度printf("Depth: %d\n", BinaryTreeDepth(root));//二叉樹查找值為x的結點BTNode* pos = BinaryTreeFind(root, 'E');if (pos){printf("找到了\n");}else {printf("沒找到\n");}
    }int main()
    {test1();return 0;
    }

    --測試完成,找的到E,退出碼為0


    ?六.二叉樹的銷毀?

    --由于提前釋放根節點無法找到其左右節點,所以我們得采用后續遍歷的思想,最后處理根節點,

    還有這里得傳地址,后續的使用也需要注意一下寫法。

    代碼實現:

    // 二叉樹銷毀--采用后序遍歷的思想
    void BinaryTreeDestory(BTNode** root)
    {if (*root == NULL){return;}BinaryTreeDestory(&(*root)->left);BinaryTreeDestory(&(*root)->right);free(*root);*root = NULL;
    }
    

    圖示如下:


    ?七.代碼展現

    Tree.h:

    #pragma once
    #include<stdio.h>
    #include<assert.h>
    #include<stdlib.h>
    #include<stdbool.h>typedef char BTDataType;
    typedef struct BinaryNode
    {BTDataType data;struct BinaryNode* left;//左孩子struct BinaryNode* right;//右孩子
    }BTNode;//前序遍歷
    void PreOrder(BTNode* root);//中序遍歷
    void InOrder(BTNode* root);//后序遍歷
    void PostOrder(BTNode* root);// 二叉樹結點個數
    int BinaryTreeSize(BTNode* root);// 二叉樹葉子結點個數
    int BinaryTreeLeafSize(BTNode* root);// 二叉樹第k層結點個數
    int BinaryTreeLevelKSize(BTNode* root, int k);//二叉樹的深度/高度
    int BinaryTreeDepth(BTNode* root);// 二叉樹查找值為x的結點
    BTNode* BinaryTreeFind(BTNode* root, BTDataType x);// 二叉樹銷毀
    void BinaryTreeDestory(BTNode** root);

    Tree.c:

    #include"Tree.h"//前序遍歷
    void PreOrder(BTNode* root)
    {if (root == NULL){printf("NULL ");return;}//根左右printf("%c ", root->data);PreOrder(root->left);PreOrder(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 BinaryTreeSize(BTNode* root)
    {if (root == NULL){return 0;}return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
    }// 二叉樹葉子結點個數=左子樹葉子節點個數+右子樹節點個數
    int BinaryTreeLeafSize(BTNode* root)
    {if (root == NULL){return 0;}//判斷是否為葉子節點(沒有左右孩子)if (root->left == NULL && root->right == NULL){return 1;}return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
    }// 二叉樹第k層節點個數=左子樹第K-1層節點個數+右子樹第k-1層節點個數
    int BinaryTreeLevelKSize(BTNode* root, int k)
    {if (root == NULL){return 0;}//判斷是否為第k層if (k == 1){return 1;}//每次注意要k-1return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
    }//二叉樹的深度/高度=根節點+max(左子樹高度,右子樹高度)
    int BinaryTreeDepth(BTNode* root)
    {if (root == NULL){return 0;}int leftdepth = BinaryTreeDepth(root->left);int rightdepth = BinaryTreeDepth(root->right);return 1 + (leftdepth > rightdepth ? leftdepth : rightdepth);
    }// 二叉樹查找值為x的結點
    BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
    {if (root == NULL){return NULL;}if (root->data == x){return root;}BTNode*leftroot = BinaryTreeFind(root->left, x);//如果leftroot不為空就是找到了直接返回if (leftroot){return leftroot;}//沒找到就繼續右子樹找BTNode* rightroot = BinaryTreeFind(root->right, x);if (rightroot){return rightroot;}//都沒找到就返回空return NULL;
    }// 二叉樹銷毀--采用后序遍歷的思想
    void BinaryTreeDestory(BTNode** root)
    {if (*root == NULL){return;}BinaryTreeDestory(&(*root)->left);BinaryTreeDestory(&(*root)->right);free(*root);*root = NULL;
    }

    test.c:

    #include"Tree.h"BTNode* buyNode(char x)
    {BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));newnode->data = x;newnode->left = newnode->right = NULL;return newnode;
    }
    BTNode* CreateTree()
    {BTNode* nodeA = buyNode('A');BTNode* nodeB = buyNode('B');BTNode* nodeC = buyNode('C');BTNode* nodeD = buyNode('D');BTNode* nodeE = buyNode('E');BTNode* nodeF = buyNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->left = nodeE;nodeC->right = nodeF;return nodeA;
    }void test1()
    {BTNode* root = CreateTree();//前中后序遍歷//PreOrder(root);//InOrder(root);//PostOrder(root);//二叉樹結點個數printf("Size: %d\n", BinaryTreeSize(root));//二叉樹葉子結點個數printf("LeafSize: %d\n", BinaryTreeLeafSize(root));//第k層節點個數printf("K Size: %d\n", BinaryTreeLevelKSize(root,3));//二叉樹的深度/高度printf("Depth: %d\n", BinaryTreeDepth(root));//二叉樹查找值為x的結點BTNode* pos = BinaryTreeFind(root, 'E');if (pos){printf("找到了\n");}else {printf("沒找到\n");}// 二叉樹銷毀BinaryTreeDestory(&root);
    }int main()
    {test1();return 0;
    }

    往期回顧:

    【數據結構初階】--樹和二叉樹先導篇

    【數據結構初階】--二叉樹(二)

    【數據結構初階】--二叉樹(三)

    【數據結構初階】--二叉樹(四)

    結語:在這篇博客中我們一起實現了二叉樹的大部分常用接口,后面還有一個判斷是否為完全二叉樹和一個層序遍歷的實現。如果文章對你有幫助的話,歡迎評論,點贊,收藏加關注,感謝大家的支持。

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

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

    相關文章

    redis布隆過濾器解決緩存擊穿問題

    在電商系統中&#xff0c;商品詳情頁是一個典型的高頻訪問場景。當用戶請求某個商品的詳情時&#xff0c;系統會優先從緩存中獲取數據。如果緩存中沒有該商品的詳情&#xff0c;系統會去數據庫查詢并更新緩存。然而&#xff0c;如果某個熱門商品的緩存失效&#xff0c;大量請求…

    1+1>2!特征融合如何讓目標檢測更懂 “場景”?

    來gongzhonghao【圖靈學術計算機論文輔導】&#xff0c;快速拿捏更多計算機SCI/CCF發文資訊&#xff5e;在多模態大模型&#xff08;MLLM&#xff09;時代&#xff0c;特征融合與目標檢測的研究方向正變得愈發關鍵。從紅外與可見光圖像的融合&#xff0c;到語音活動檢測中的特征…

    詳解賽靈思SRIO IP并提供一種FIFO封裝SRIO的收發控制器仿真驗證

    概述RapidIO標準定義為三層&#xff1a;邏輯層、傳輸層、物理層。邏輯層&#xff1a;定義總體協議和包格式&#xff0c;包含設備發起/完成事務的必要信息。傳輸層&#xff1a;提供包傳輸的路由信息&#xff08;對頂層不可見&#xff09;。物理層&#xff1a;描述設備級接口細節…

    深度學習:簡介與任務分類總覽

    一、什么是深度學習&#xff1f;1.1 深度學習的定義深度學習&#xff08;Deep Learning&#xff09;是機器學習的一種特殊形式&#xff0c;它依賴于具有多層結構的神經網絡自動從數據中學習特征并完成任務&#xff0c;如圖像識別&#xff0c;語音識別&#xff0c;自然語言處理等…

    MSPM0開發學習筆記:二維云臺畫圖(2025電賽 附源代碼及引腳配置)

    前言 今年的電賽&#xff08;2025&#xff09;&#xff0c;很多題都與云臺相關&#xff0c;因此為備戰電賽&#xff0c;博主這邊也是準備了一個由兩個42步進電機驅動的云臺并提前進行調試&#xff0c;避免賽題出來之后手忙腳亂的&#xff0c;這邊的兩個42步進電機采用同一個驅…

    借助 Wisdom SSH 的 AI 助手構建 Linux 開發環境

    借助Wisdom SSH的AI助手構建Linux開發環境 在Linux系統的開發場景中&#xff0c;快速、準確地搭建開發環境至關重要。Wisdom SSH憑借其強大的AI助手&#xff0c;能極大簡化這一過程&#xff0c;其官網為ssh.wisdomheart.cn。以下以在Ubuntu 22.04服務器上構建Python開發環境&am…

    Python 程序設計講義(44):組合數據類型——集合類型:創建集合

    Python 程序設計講義&#xff08;44&#xff09;&#xff1a;組合數據類型——集合類型&#xff1a;創建集合 目錄Python 程序設計講義&#xff08;44&#xff09;&#xff1a;組合數據類型——集合類型&#xff1a;創建集合一、集合的特征二、創建集合&#xff1a;使用set()函…

    10 - 大語言模型 —Transformer 搭骨架,BERT 裝 “雙筒鏡”|解密雙向理解的核心

    目錄 1、為什么 BERT 能 “懂” 語言&#xff1f;先看它的 “出身” 2、核心邏輯 2.1、“自學階段”—— 預訓練&#xff0c;像嬰兒學說話一樣積累語感 2.1.1、簡述 2.1.2、核心本事&#xff1a;“雙向注意力”&#xff0c;像人一樣 “聚焦重點” 2.2、“專項復習”—— …

    【Spring Boot 快速入門】四、MyBatis

    目錄MyBatis&#xff08;一&#xff09;入門簡介MyBatis 入門LombokMyBatis 基礎操作數據準備刪除預編譯新增更新查詢XML 映射文件MyBatis&#xff08;一&#xff09;入門 簡介 MyBatis 是一款 優秀的持久層框架&#xff0c;它支持 自定義 SQL、存儲過程以及高級映射&#xf…

    Spring IOC 基于Cglib實現含構造函數的類實例化策略

    作者&#xff1a;小凱 分享、讓自己和他人都能有所收獲&#xff01; 一、前言 技術成長&#xff0c;是對場景設計細節不斷的雕刻&#xff01; 你覺得自己的技術什么時候得到了快速的提高&#xff0c;是CRUD寫的多了以后嗎&#xff1f;想都不要想&#xff0c;絕對不可能&#xf…

    composer 常用命令

    ### 設置鏡像源全局設置composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/當個項目設置composer config repo.packagist composer https://mirrors.aliyun.com/composer/恢復官方源composer config -g --unset repos.packagist### 常用源阿里云…

    【python】Python爬蟲入門教程:使用requests庫

    Python爬蟲入門教程&#xff1a;使用requests庫 爬蟲是數據獲取的重要手段&#xff0c;下面我將通過一個完整的示例&#xff0c;教你如何使用Python的requests庫編寫一個簡單的爬蟲。我們將以爬取豆瓣電影Top250為例。 【python】網絡爬蟲教程 - 教你用python爬取豆瓣電影 Top…

    OpenCV圖像縮放:resize

    圖像縮放是圖像處理中的基礎操作之一。無論是圖像預處理、數據增強還是圖像金字塔構建&#xff0c;cv::resize 都是我們最常用的函數之一。但你是否注意到&#xff0c;在 OpenCV 中同時還存在一個名為 cv::Mat::resize 的方法&#xff1f;這兩個函數雖然名字類似&#xff0c;但…

    汽車、航空航天、適用工業虛擬裝配解決方案

    一、現狀在制造業數字化轉型浪潮中&#xff0c;傳統裝配過程仍面臨諸多挑戰&#xff1a;物理樣機試錯成本高、裝配周期冗長、工藝優化依賴經驗、跨部門協作效率低下……如何打破“試錯-返工”的惡性循環&#xff1f;目前總裝工藝通過DELMIA、NX、Creo等工程軟件進行工藝裝配驗證…

    頁面跳轉和前端路由的區別

    傳統方式&#xff1a;通過改變瀏覽器地址欄的 URL 來實現window.location.href /new-page<a href"/new-page">跳轉到新頁面</a>會導致整個頁面重新加載會觸發瀏覽器向服務器發送新的請求頁面狀態不會保留&#xff0c;所有資源重新加載可以避免新上線的內…

    C/C++核心知識點詳解

    C/C核心知識點詳解 1. 變量的聲明與定義&#xff1a;內存分配的本質區別 核心概念 在C/C中&#xff0c;變量的聲明和定義是兩個完全不同的概念&#xff1a; 聲明&#xff08;Declaration&#xff09;&#xff1a;告訴編譯器變量的名稱和類型&#xff0c;但不分配內存空間定義&a…

    物聯網發展:從概念到應用的演變歷程

    物聯網的發展歷程是一部技術革新與社會需求共同驅動的進化史&#xff0c;其演變可劃分為概念萌芽、技術積累、應用拓展和智能融合四個階段&#xff0c;每個階段均以關鍵技術突破或社會需求變革為標志&#xff0c;最終形成萬物互聯的智能生態。以下是具體演變歷程&#xff1a;一…

    一個人開發一個App(數據庫)

    后端要保存數據&#xff0c;我還是選擇了關系型數據庫Mysql, 因為其它的不熟悉。 flutter端這次我選擇的是ObjectBox&#xff0c;以前都是直接用的sqlite3&#xff0c;看對比ObjectBox效率比sqlite3高許多&#xff0c;這次前端為了用戶體驗&#xff0c;我需要緩存數據&#xff…

    天銘科技×藍卓 | “1+2+N”打造AI驅動的汽車零部件行業智能工廠

    7月24日&#xff0c;杭州天銘科技股份有限公司&#xff08;簡稱 “天銘科技”&#xff09;與藍卓數字科技有限公司&#xff08;簡稱 “藍卓”&#xff09;簽訂全面戰略合作協議。天銘科技董事長張松、副總經理艾鴻冰&#xff0c;藍卓副董事長譚彰等領導出席簽約儀式&#xff0c…

    技術復盤報告:Vue表格中多行文本字段數據保存丟失問題

    1. 問題背景 在一個基于 Vue 2.0 和 ElementUI 的復雜數據維護頁面中&#xff0c;用戶報告了一個偶發但嚴重的問題&#xff1a;在表格中編輯一個多行文本&#xff08;textarea&#xff09;字段時&#xff0c;輸入的內容有時會在點擊“保存”后丟失。 具體表現&#xff1a; 前端…