《鏈式二叉樹常用操作全解析》

目錄

一.求鏈式二叉樹節點個數

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

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

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

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

?六.鏈式二叉樹的銷毀?

七. 測試函數

八. 總結:


前言:

在學習鏈式二叉樹的常用操作之前 我們需要手動創建一個二叉樹 在上文的學習中 我們已經學習過了 鏈式二叉樹的創建 代碼如下

#define _CRT_SECURE_NO_WARNINGS 
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>// 二叉樹節點結構定義
typedef char BTDataType;
typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
} BTNode;// 創建新節點
BTNode* BuyBTNode(BTDataType x) {BTNode* node = (BTNode*)malloc(sizeof(BTNode));if (node == NULL) {printf("malloc failed\n");exit(-1);}node->data = x;node->left = NULL;node->right = NULL;return node;
}// 構建示例二叉樹(便于測試)
BTNode* CreateBinaryTree() {BTNode* nodeA = BuyBTNode('A');BTNode* nodeB = BuyBTNode('B');BTNode* nodeC = BuyBTNode('C');BTNode* nodeD = BuyBTNode('D');BTNode* nodeE = BuyBTNode('E');BTNode* nodeF = BuyBTNode('F');nodeA->left = nodeB;nodeA->right = nodeC;nodeB->left = nodeD;nodeC->right = nodeE;nodeC->left = nodeF;return nodeA;
}

一.求鏈式二叉樹節點個數

代碼實現:?

// 一、求二叉樹節點個數
int BinaryTreeSize(BTNode* root) {// 空樹節點個數為0return root == NULL ? 0 : 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}
  • 功能:計算二叉樹中所有節點的總數。
  • 實現思路:
    • 空樹(root == NULL)返回 0;
    • 非空樹則返回「1(當前節點)+ 左子樹節點數 + 右子樹節點數」;
    • 遞歸遍歷整個樹,累加所有節點。
  • 時間復雜度:O (n),需訪問每個節點一次。

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

代碼實現:

// 二、求二叉樹葉子節點個數
int BinaryTreeLeafSize(BTNode* root) {// 空樹葉子節點個數為0if (root == NULL) {return 0;}// 左右孩子都為空的節點是葉子節點if (root->left == NULL && root->right == NULL) {return 1;}// 遞歸計算左右子樹的葉子節點總和return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}
  • 功能:統計二叉樹中葉子節點(無左右子樹的節點)的數量。
  • 實現思路:
    • 空樹返回 0;
    • 若當前節點的左右指針均為NULL,則是葉子節點,返回 1;
    • 否則遞歸計算左子樹和右子樹的葉子節點之和。

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

代碼實現:?

// 三、求二叉樹第k層節點個數
int BinaryTreeLevelKSize(BTNode* root, int k) {assert(k >= 1); // k必須是正整數// 空樹或k小于1,返回0if (root == NULL) {return 0;}// 第1層只有根節點if (k == 1) {return 1;}// 第k層節點個數 = 左子樹第k-1層節點數 + 右子樹第k-1層節點數return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
}
  • 功能:計算二叉樹中第 k 層(根節點為第 1 層)的節點總數。
  • 實現思路:
    • 邊界檢查:k < 1時斷言報錯,空樹返回 0;
    • 遞歸降層:第 k 層節點數等價于左右子樹第 k-1 層節點數之和;
    • 終止條件:k == 1時,當前節點即為第 1 層節點,返回 1。
  • 注意:若 k 大于樹的深度,返回 0。

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

?代碼實現:

// 四、求二叉樹的深度/高度
int BinaryTreeDepth(BTNode* root) {// 空樹深度為0if (root == NULL) {return 0;}// 計算左右子樹深度int leftDepth = BinaryTreeDepth(root->left);int rightDepth = BinaryTreeDepth(root->right);// 樹的深度 = 左右子樹最大深度 + 1(當前節點)return leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
}
  • 功能:計算二叉樹的最大深度(從根節點到最遠葉子節點的層數)。
  • 實現思路:
    • 空樹深度為 0;
    • 遞歸計算左子樹和右子樹的深度;
    • 當前樹的深度 = 左右子樹中最大深度 + 1(當前節點所在層)。
  • 特點:體現了「分治思想」,將樹的深度問題分解為子樹的深度問題。

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

代碼實現:

// 五、二叉樹查找值為x的節點
BTNode* BinaryTreeFind(BTNode* root, BTDataType x) {// 空樹返回NULLif (root == NULL) {return NULL;}// 找到目標節點,返回該節點指針if (root->data == x) {return root;}// 先在左子樹查找BTNode* leftRet = BinaryTreeFind(root->left, x);if (leftRet != NULL) {return leftRet;}// 左子樹沒找到,再在右子樹查找BTNode* rightRet = BinaryTreeFind(root->right, x);return rightRet;
}
  • 功能:在二叉樹中查找值為 x 的節點,返回該節點的指針(若不存在返回NULL)。
  • 實現思路:
    • 空樹返回NULL
    • 先檢查當前節點是否為目標節點,是則返回;
    • 否則先遞歸查找左子樹,找到則返回;
    • 左子樹未找到時,遞歸查找右子樹并返回結果。
  • 查找順序:本質是「前序遍歷查找」,先根節點,再左子樹,最后右子樹。

?六.鏈式二叉樹的銷毀?

代碼實現:

// 六、二叉樹的銷毀
void BinaryTreeDestroy(BTNode** root) {// 空樹直接返回if (*root == NULL) {return;}// 先銷毀左子樹BinaryTreeDestroy(&(*root)->left);// 再銷毀右子樹BinaryTreeDestroy(&(*root)->right);// 最后釋放當前節點free(*root);*root = NULL; // 避免野指針
}
  • 功能:釋放二叉樹所有節點的內存,徹底銷毀樹結構。
  • 實現思路:
    • 采用「后序遍歷」思路:先銷毀左子樹,再銷毀右子樹,最后釋放當前節點;
    • 使用二級指針**root,確保銷毀后根節點被置為NULL,避免野指針;
    • 遞歸釋放所有節點,無內存泄漏。
  • 關鍵:必須先釋放子樹,再釋放當前節點,否則會丟失子樹指針導致內存泄漏。

七. 測試函數

//測試函數
int main() {BTNode* root = CreateBinaryTree();// 測試節點個數printf("二叉樹節點總數: %d\n", BinaryTreeSize(root));// 測試葉子節點個數printf("二叉樹葉子節點個數: %d\n", BinaryTreeLeafSize(root));// 測試第k層節點個數printf("第2層節點個數: %d\n", BinaryTreeLevelKSize(root, 2));printf("第3層節點個數: %d\n", BinaryTreeLevelKSize(root, 3));// 測試樹的深度printf("二叉樹深度: %d\n", BinaryTreeDepth(root));// 測試查找節點BTNode* findNode = BinaryTreeFind(root, 'E');if (findNode != NULL) {printf("找到節點: %c\n", findNode->data);}else {printf("未找到節點\n");}// 銷毀二叉樹BinaryTreeDestroy(&root);assert(root == NULL); // 驗證樹已被銷毀return 0;
}

代碼運行結果如下:

鏈式二叉樹如下圖 進行驗證

根據上圖 不難得出 代碼運行 正確

八. 總結:

所有函數均采用遞歸實現,符合二叉樹的遞歸特性(每個節點的左、右子樹仍是二叉樹)。核心思想是「分治」:將對整棵樹的操作分解為對根節點和左右子樹的操作,簡化問題復雜度。每個函數的時間復雜度均為 O (n)(n 為節點總數),空間復雜度為 O (h)(h 為樹的高度,遞歸棧的深度)。

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

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

相關文章

YOLO11目標檢測運行推理簡約GUI界面

YOLO11推理簡約GUI界面使用方法&#xff1a;支持pt和onnx格式模型,并且自動檢測設備&#xff0c;選擇推理設備選擇推理圖片所在的文件夾 選擇推理后的結果保存地址選擇所需要的置信度閾值點擊開始推理&#xff0c;程序自動運行 并在下方實時顯示推理進度非常方便不用每次都改代…

集值優化問題:理論、應用與前沿進展

本文由「大千AI助手」原創發布&#xff0c;專注用真話講AI&#xff0c;回歸技術本質。拒絕神話或妖魔化。搜索「大千AI助手」關注我&#xff0c;一起撕掉過度包裝&#xff0c;學習真實的AI技術&#xff01; 1. &#x1f4da; 集值優化問題概述 集值優化問題主要研究目標函數為…

提示工程架構師分享:如何用提示詞升級職業教育的實操案例教學?(萬字長文來襲,高能預警!!!)

引言&#xff1a;實操案例教學的“困境”&#xff0c;終于有了破局思路&#xff1f; 晚上10點&#xff0c;汽修專業的王強老師還在電腦前修改《汽車發動機異響故障排查案例》——這已經是他本周第四次調整方案了&#xff1a; 第一次授課時&#xff0c;學生反饋“案例太理想化&a…

「日拱一碼」087 機器學習——SPARROW

目錄 SPARROW 介紹 核心思想&#xff1a;稀疏掩碼訓練 與 Lottery Ticket Hypothesis (LTH) 的關系 代碼示例 代碼關鍵點解釋&#xff1a; 在機器學習領域&#xff0c;"SPARROW" 并不是一個像 Scikit-learn、TensorFlow 或 PyTorch 那樣廣為人知的通用框架或算法…

18、決策樹與集成學習 - 從單一智慧到群體決策

學習目標:理解決策樹的構建原理和分裂標準,掌握信息增益、基尼系數等概念,學會決策樹的剪枝方法,深入理解集成學習的思想,掌握隨機森林和梯度提升的基本原理。 > 從第17章到第18章:從概率模型到規則模型 在第17章中,我們學習了邏輯回歸——一個基于概率的線性分類器…

王道計算機組成原理 學習筆記

第一章計算機系統概述1.1計算機的發展歷程1.2計算機系統層次結構1.2.11.2.2 計算機硬件的基本組成1.2.2 各個硬件的工作原理1.2.3 計算機軟件1.2.4 計算機系統的層次結1.2.5 計算機系統的工作原理1.3計算機的性能指標第二章數據的表示和運算第三章存儲系統第四章指令系統第五章…

Oracle 筆記1 表空間及用戶

Oracle 筆記1 表空間及用戶1 安裝Oracle2 創建表空間3 創建表空間用戶1. 核心管理用戶2. 示例與工具用戶3. 系統與服務用戶4. 創建表空間用戶5. 修改表空間用戶特性OracleMySQL開發商Oracle 公司最初由 MySQL AB 開發&#xff0c;后被 Sun 收購&#xff0c;現屬 Oracle 公司數據…

MyBatis主鍵返回機制解析

關于 MyBatis 主鍵返回的深入解釋 核心問題&#xff1a;信息隔離 數據庫和應用程序是兩個獨立的系統&#xff1a; 數據庫在服務器上執行 INSERT 操作并生成主鍵應用程序在另一個進程或甚至另一臺機器上運行如果沒有明確的機制&#xff0c;應用程序無法自動知道數據庫生成了什么…

【Python】Python內置函數大全解析(附源碼)

目錄專欄導讀前言&#x1f680; 功能特性1. 全面的函數覆蓋2. 多種查詢工具3. 完整的測試驗證&#x1f6e0;? 使用方法基本使用交互式查詢運行測試&#x1f4da; 支持的內置函數分類數學運算 (13個)類型轉換 (8個)序列操作 (8個)迭代器 (6個)輸入輸出 (3個)對象操作 (31個)&am…

每日算法題推送

題目1&#xff1a;快樂數 我們先來結合實例看一下判斷快樂數的整個過程&#xff1a; 結合題目可以知道&#xff0c;如果一個數是快樂數&#xff0c;那么這個數最終就會變成1&#xff0c;如果一個數不是快樂數&#xff0c;那么變化序列最終就會陷入循環。想一下&#xff0c;如果…

Oracle體系結構-數據文件(Data Files)

一、 數據文件的本質與原理 物理存儲的基石&#xff1a; 數據文件是 Oracle 數據庫在操作系統層面最核心、最基礎的物理存儲單元。它們是存儲在服務器硬盤&#xff08;或存儲陣列&#xff09;上的操作系統文件&#xff08;如 .dbf, .ora 擴展名常見&#xff0c;但非強制&#x…

【C++練習】18.C++求兩個整數的最小公倍數(LCM)

目錄C求兩個整數的最小公倍數(LCM)的方法方法一&#xff1a;利用最大公約數(GCD)計算代碼實現方法二&#xff1a;逐次增加法代碼實現方法三&#xff1a;質因數分解法代碼實現方法比較處理大數和特殊情況改進版GCD方法實現 C求兩個整數的最小公倍數(LCM)的方法 最小公倍數(LCM)是…

Linux網絡:應用層協議http

前言 雖然我們說&#xff0c;應用層協議是我們程序猿自己定的。但實際上,已經有大佬們定義了一些現成的,又非常好用的應用層協議,供我們直接參考使用.HTTP(超文本傳輸協議)就是其中之一。 我們之前已經學了UDP與TCP套接字的簡單使用&#xff0c;以及講解了進程間的各種關系&a…

ffmpeg推流測試

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄前言一、操作步驟1.測試12.測試2總結前言 提示&#xff1a;這里可以添加本文要記錄的大概內容&#xff1a; 環境信息&#xff1a; 攝像頭&#xff1a;usb攝像頭 &a…

Docker的使用及核心命令

文章目錄Docker基礎概念鏡像管理命令鏡像查看和搜索鏡像下載和刪除鏡像構建容器生命周期管理創建和啟動容器容器控制命令容器清理容器交互和調試進入容器文件操作日志和監控數據管理數據卷&#xff08;Volume&#xff09;綁定掛載網絡管理網絡基礎操作端口映射Dockerfile和Dock…

考研408計算機網絡第36題真題解析(2021-2023)

&#xff08;2023.36&#xff09;在使用 CSMA/CD 協議的環境中&#xff0c;使用截斷二進制指數退避算法&#xff0c;來選擇重傳時機&#xff0c;算法 有如下規定&#xff1a; &#xff08;1&#xff09;基本的退避時間為爭用期 2τ&#xff0c;假設某網絡具體的爭用期為 51.2us…

Asio C++ Library是用來做什么的

hriskohlhoff/asio 是由 Chris Kohlhoff 主導維護的開源 C 庫&#xff0c;專注于提供高效、跨平臺的異步 I/O 支持&#xff0c;廣泛應用于網絡編程、并發控制和高性能系統開發。 &#x1f4d8; 項目概述 項目名稱&#xff1a;Asio C Library 下載地址&#xff1a;https://down…

ac791的按鍵ad_channel

每次ad_channel這個參數都要給我一定的迷惑性&#xff0c;讓我以為這是通道的數量

機器人巡檢與巡邏的區別進行詳細講解和對比

機器人巡檢與巡邏的區別進行詳細講解和對比 盡管這兩個詞經常被混用&#xff0c;但在技術和應用層面上&#xff0c;它們有著本質的區別。核心區別在于&#xff1a;巡檢是“深度體檢”&#xff0c;而巡邏是“治安巡查”。 以下將從多個維度進行詳細講解和對比。 一、核心概念與目…

先進電機拓撲及控制算法介紹(3)——以“數據”驅動電機實現真正的無模型

1. 背景介紹 之前已經介紹過“無模型預測控制&#xff08;Model-Free Predictive Control/MFPC&#xff09;”中的“無模型預測電流控制&#xff08;Model-Free Predictive Current Control/MFPCC&#xff09;”&#xff0c;可參考下面知乎。 https://zhuanlan.zhihu.com/p/6…