考研數據結構Part3——二叉樹知識點總結

??一、前言

? ? ? 二叉樹是一種特殊的樹形結構,每個節點最多有兩個子節點,分別稱為左子樹和右子樹。其特點是子樹有嚴格的左右之分,順序不可顛倒。從歷年真題來看,二叉樹的鏈式存儲實現、遍歷算法、屬性統計是高頻考點,常以選擇題(概念辨析)、填空題(代碼補全)、編程題(算法實現)形式出現。

????????二叉樹的常見類型包括:

  • 滿二叉樹:所有非葉子節點均有兩個子節點,且所有葉子節點在同一層。
  • 完全二叉樹:除最后一層外,其他層節點數達到最大值,且最后一層節點向左對齊。
  • 二叉搜索樹(BST):左子樹所有節點的值小于根節點,右子樹所有節點的值大于根節點。

二、二叉樹

???????二叉樹通常用鏈式存儲或順序存儲(數組)實現。二叉樹的鏈式存儲通過節點連接實現,每個節點包含數據域和兩個指針域(分別指向左子樹和右子樹)。

1.定義

typedef struct BiTNode{char data;struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;

2.基本操作

(1)初始化二叉樹

????????初始化操作將二叉樹根節點的左右子樹指針設為NULL,確保樹的初始狀態為空。

bool InitBiTree(BiTree &T){T->lchild = NULL;T->rchild = NULL;return true;
}

(2)創建二叉樹(遞歸法)

????????基于先序遍歷規則構建二叉樹,通過遞歸方式依次創建根節點、左子樹和右子樹,#符號用于標識空節點。

void CreateBiTree(BiTree &T){char ch;scanf("%c",&ch);if(ch=='#')T=NULL;else{T=(BiTNode *)malloc(sizeof(BiTNode));T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}	
}

(3)銷毀二叉樹

????????采用后序遍歷思路,先遞歸銷毀左、右子樹,再釋放當前節點,確保所有內存被正確回收。

void DestroyBiTree(BiTree &T){if(T){if(T->lchild)DestroyBiTree(T->lchild);if(T->rchild)DestroyBiTree(T->rchild);	free(T);T=NULL;}
}

(4)遍歷操作

????????二叉樹的遍歷是訪問所有節點的過程,常見方式包括先序、中序、后序(遞歸 / 非遞歸)和層序遍歷。

  • 先序遍歷(遞歸)

遞歸實現簡潔,先訪問當前節點,再依次遍歷左、右子樹。

//訪問輸出結點
void visit(BiTree T){printf("%c",T->data);}
//先序-遞歸
void PreOrder(BiTree T){if(T!=NULL){visit(T);PreOrder(T->lchild);PreOrder(T->rchild);}
}
  • 中序遍歷(非遞歸,借助棧)

非遞歸實現需借助棧,先將所有左節點入棧,再依次彈出并訪問,最后遍歷右子樹。

void InOrder2(BiTree T){SqStack S;InitStack(S);BiTree p=T;while(p!=NULL||!StackEmpty(S)){if(p){Push(S,p);p=p->lchild;}else{Pop(S,p);visit(p);p=p->rchild;}}
} 
  • 層序遍歷(借助隊列)

利用隊列實現,依次將每層節點入隊,出隊時訪問節點并將其子女入隊,確保按層次順序遍歷。

void LevelOrder(BiTree T){SqQueue Q;InitQueue(Q);BiTree p;EnQueue(Q,T);while(!IsEmpty(Q)){DeQueue(Q,p);visit(p);if(p->lchild!=NULL){EnQueue(Q,p->lchild);}if(p->rchild!=NULL){EnQueue(Q,p->rchild);}}
}

(5)二叉樹的屬性統計

????????二叉樹的屬性統計是分析樹結構特征的重要操作,包括節點類型計數、高度和寬度計算等。這些屬性不僅反映了樹的形態特征,也為算法設計(如平衡樹判斷、最優路徑搜索)提供基礎數據。

  • 統計葉子節點(度為0的節點)
int Degree0(BiTree T){if(T==NULL) return 0;else if(T->lchild==NULL&&T->rchild==NULL) return 1;else return Degree0(T->lchild)+Degree0(T->rchild);
}
  • 統計度為1的節點
int Degree1(BiTree T){if(T==NULL) return 0;if((T->rchild==NULL && T->lchild!=NULL) || (T->rchild!=NULL && T->lchild==NULL))return Degree1(T->lchild)+Degree1(T->rchild)+1;else return Degree1(T->lchild)+Degree1(T->rchild);
}
  • 統計度為2的節點
int Degree2(BiTree T){if(T==NULL) return 0;if(T->rchild!=NULL && T->lchild!=NULL )	return  Degree2(T->lchild)+Degree2(T->rchild)+1;else return Degree2(T->lchild)+Degree2(T->rchild);
}
  • 計算樹的高度
int BtDepth(BiTree T){if(T==NULL) return 0;int ldep = BtDepth(T->lchild);int rdep = BtDepth(T->rchild);if(ldep > rdep) return ldep+1;else return rdep+1;
}

    3.主函數示例(功能測試)

    int main() {BiTree T1;InitBiTree(T1);printf("請輸入二叉樹的先序序列(以#表示空節點):");CreateBiTree(T1);  // 構建二叉樹printf("中序遍歷結果:");InOrder2(T1);      // 測試中序非遞歸遍歷printf("\n層序遍歷結果:");LevelOrder(T1);    // 測試層序遍歷printf("\n葉子節點個數:%d", Degree0(T1));printf("\n度為1,2的節點個數分別為:%d,%d", Degree1(T1),Degree2(T1));printf("\n樹的高度:%d", BtDepth(T1));DestroyBiTree(T1);  // 銷毀二叉樹,釋放內存return 0;
    }

    三、總結與提示

    1. 時間復雜度分析:所有遍歷算法的時間復雜度均為O(n),其中n為節點數量

    2. 空間復雜度分析

      • 遞歸遍歷:O(h),h為樹高(遞歸棧空間)

      • 非遞歸中序遍歷:O(h)(棧空間)

      • 層序遍歷:O(w),w為樹的最大寬度(隊列空間)

    3. 實用技巧

      • 先序+中序或后序+中序可以唯一確定一棵二叉樹

      • 遞歸算法簡潔但可能存在棧溢出風險,非遞歸算法更安全

      • 銷毀二叉樹務必使用后序遍歷,避免內存泄漏

    四、附錄

    ????????完整源碼位于資源包中,有需要請自取。后續將繼續分享更多數據結構與算法相關內容。
    ? ? ? ? 數據結構專欄-實現源碼(基于C語言)資源-CSDN下載

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

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

    相關文章

    網絡與信息安全有哪些崗位:(12)威脅分析師

    今天是七夕節,首先祝大家早遇良緣、有情人終成眷屬!!七夕節快樂、工作順利、學業有成~~ 想知道網絡與信息安全領域有哪些具體崗位嗎?此前我們已陸續介紹網絡安全工程師、滲透測試工程師、SOC 總監、SOC 工具運維工程師等核心角色&…

    mysql雙機熱備(主主模式)

    一、環境準備 主機名ip操作系統備注node01192.168.48.91CentOS Linux 7 (Core)mysql主庫node01192.168.48.92CentOS Linux 7 (Core)mysql主庫192.168.48.90漂移IP(VIP) centos7鏡像下載地址: https://mirrors.aliyun.com/centos/7.9.2009/…

    微積分 | 積分代換

    注:本文為 “微積分 | 積分代換法 ” 相關合輯。 英文引文,機翻未校, 中文引文,略作重排。 未去重,如有內容異常,請看原文。 Integration by Substitution 積分代換法 May 23, 2018 / By Dave Peterson …

    循環高級(1)

    1.無限循環2.break3.coutinue4.練習1 打印矩形&#xff08;循環嵌套&#xff09;5.練習2 打印直角三角形#include<stdio.h> int main() {/*打印一個5行5列的三角形效果如下&#xff1a;***** ***** ***** ***** *****…

    vpp開啟nat,分片包丟包問題分析與解決

    現象描述兩個網口都開啟nat output-feature&#xff0c;路由模式進行大包轉發&#xff0c;網絡不同&#xff0c;小包轉發沒問題。通過trace發現&#xff0c;在nat44-ed-in2out-output-slowpath節點丟包。Packet 503:50:43:447292: handoff_traceHANDED-OFF: from thread 2 trac…

    深入解析交換機端口安全:Sticky MAC的工作原理與應用實踐

    深入解析交換機端口安全&#xff1a;Sticky MAC的工作原理與應用實踐在當今企業網絡環境中&#xff0c;未授權設備接入是常見的安全威脅之一&#xff0c;而Sticky MAC技術正是解決這一問題的利器。在網絡安全管理中&#xff0c;端口安全是保護網絡基礎設施的第一道防線。Sticky…

    AI接管瀏覽器:Anthropic發布Claude for Chrome,是效率革命還是安全噩夢?

    AI智能體&#xff08;Agent&#xff09;的競賽&#xff0c;正在以超乎想象的速度進入白熱化階段。 就在上個月&#xff0c;OpenAI剛剛憑借ChatGPT Agent&#xff0c;向世界展示了AI在云端遠程操作電腦、制作PPT的強大能力。而現在&#xff0c;它的老對手Anthropic&#xff0c;…

    LFI-labs靶場通關教程

    目錄 CMD01-06 pass01 pass02 pass03 pass04 pass05 pass06 HDR-1 hdr-1 LFI-01-14 pass01 pass02 pass03 pass04 pass05 pass06 pass07 pass08 pass09 pass10 pass11 pass12 pass13 pass14 CMD01-06 pass01 看看源碼, 這里顯示的是一個get參數cmd,并…

    隨機森林的 “Bootstrap 采樣” 與 “特征隨機選擇”:如何避免過擬合?(附分類 / 回歸任務實戰)

    隨機森林的 “Bootstrap 采樣” 與 “特征隨機選擇”&#xff1a;如何避免過擬合&#xff1f;&#xff08;附分類 / 回歸任務實戰&#xff09; 第一部分&#xff1a;揭開隨機森林的神秘面紗 1.1 告別“過擬合”&#xff0c;擁抱更強大的模型 在機器學習的旅程中&#xff0c;…

    Java開發 - 緩存

    一、RedisUtil封裝package com.qj.redis.util;import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component;import javax.annotation.Resource; import java.util.Set; import java.util.…

    光伏發多少電才夠用?匹配家庭用電需求

    在“雙碳”目標推動下&#xff0c;新能源產業迎來爆發式增長&#xff0c;家庭屋頂光伏憑借清潔環保、能降低電費的優勢&#xff0c;成為越來越多家庭的選擇。但很多家庭在安裝前都會陷入一個核心困惑&#xff1a;到底裝多大容量的光伏系統&#xff0c;發多少電才能剛好滿足自家…

    如何管理跨境電商多語種素材?數字資產本地化指南

    核心要點&#xff1a; 問題&#xff1a; 多語言內容管理真的那么難嗎&#xff1f;多語種內容素材雜亂、反復翻譯浪費預算、上線延遲影響市場窗口期&#xff0c;跨境電商如何高效管理全球素材&#xff1f; 答案&#xff1a; 借助 AI 驅動的數字資產管理系統&#xff0c;跨境品…

    Git 8 ,git 分支開發( 切換分支開發,并設置遠程倉庫默認分支 )

    目錄 前言 一、&#x1f4cd;環境背景 二、&#x1f4bb; 完整流程 三、&#x1f4dd; 順序總覽 四、&#x1f539;關系圖例 五、?暫存警告 六、?? 默認分支 七、&#x1f7e3;更多操作 前言 在團隊開發或多人協作的項目中&#xff0c;Git 是最常用的版本管理工具。一個常見…

    如何在mysql中執行創建數據庫的腳本文件?

    1、先準備好腳本文件&#xff0c;.sql擴展名的把腳本文件放在某個盤的根目錄&#xff08;也可以不是根目錄&#xff0c;根目錄的話路徑會簡單一些&#xff09;,這里我放在C盤的根目錄下。腳本文件內容如下&#xff1a;/* SQLyog Community v13.1.1 (32 bit) MySQL - 5.7.26 : D…

    《AI智脈速遞》2025 年 8 月22 日 - 29 日

    歐盟 AI 法案正式生效&#xff1a;禁止社會評分&#xff0c;規范生成式 AI 內容標注 8 月 21 日&#xff0c;歐盟《人工智能法案》全面實施&#xff0c;明確禁止社會評分、實時面部識別等高風險 AI 應用&#xff0c;要求生成式 AI 內容必須標注來源。該法案被視為全球最嚴格的 …

    iOS 審核 4.3a【二進制加固】

    我們應該知道,面對iOS 上架 遇到4.3a的問題或者制作馬甲包.最基礎的操作就是混淆代碼尤其是我們專業做上架的,需要對各種語言的編譯模式,產物,以及ipa構成都需要非常了解, 每種語言開發的App的編譯產物不同,針對不同的編譯產物做不同的處理方式有一些經驗的開發者, 應該知道 目…

    使用Python腳本執行Git命令

    說明&#xff1a;本文介紹如何使用Python腳本在某個目錄下執行Git命令 編碼 直接上代碼 import os import subprocessdef open_git_bash_and_run_command(folder_path, git_command):# 檢查文件夾路徑是否存在if not os.path.exists(folder_path):print(f"錯誤&#xff1a…

    2025docker快速部署Nginx UI可視化管理平臺

    1、nginx-ui簡介 Nginx UI 是一個開源項目&#xff0c;旨在為著名的 Web 服務器和反向代理軟件 Nginx 提供一個基于網頁的圖形化用戶界面&#xff08;GUI&#xff09;。它的核心目標是讓 Nginx 的配置和管理變得可視化、簡單化和自動化&#xff0c;從而降低其使用門檻&#xf…

    數據防泄與最小可見:ABP 統一封裝行級安全(RLS)+ 列級脫敏

    數據防泄與最小可見&#xff1a;ABP 統一封裝行級安全&#xff08;RLS&#xff09; 列級脫敏 TL;DR&#xff1a;把“誰能看到哪些行、字段可見到哪一位”下沉到數據庫強制層&#xff08;PostgreSQL&#xff1a;RLS 安全視圖&#xff1b;SQL Server&#xff1a;RLS DDM&#x…

    網絡編程 04:TCP連接,客戶端與服務器的區別,實現 TCP 聊天及文件上傳,Tomcat 的簡單使用

    一、概述 記錄時間 [2025-08-29] 前置文章&#xff1a; 網絡編程 01&#xff1a;計算機網絡概述&#xff0c;網絡的作用&#xff0c;網絡通信的要素&#xff0c;以及網絡通信協議與分層模型 網絡編程 02&#xff1a;IP 地址&#xff0c;IP 地址的作用、分類&#xff0c;通過 …