數據結構(六):樹與二叉樹

一、樹的基本概念

  1. 樹的定義
    樹(Tree)是由 n(n ≥ 0)個節點組成的有限集合,當 n = 0 時稱為空樹。非空樹中:

    • 有且僅有一個根節點(Root);

    • 其余節點可以劃分為若干個互不相交的子樹,每個子樹本身也是一棵樹。

  2. 樹的節點與術語

    • 節點包含數據和若干分支;

    • 度(Degree):節點擁有的子樹數量;

    • 葉子節點:度為 0 的節點;

    • 非終端節點:度不為 0 的節點(又稱分支節點);

    • 孩子(Child)雙親(Parent):節點間的直接連接關系;

    • 兄弟節點(Sibling):同一雙親下的節點;

    • 祖先與子孫:從根到某節點的路徑上所有節點為祖先,某節點下所有子節點為子孫。

  3. 其他概念

    • 層次(Level):根為第一層,孩子為第二層,以此類推;

    • 深度(Depth)或高度:節點最大層次;

    • 有序樹與無序樹:若子樹順序不能交換則為有序樹,否則為無序樹。


二、樹的存儲結構

樹的存儲可分為:

  • 順序結構(如數組);

  • 鏈式結構(如鏈表);
    實際開發中,樹通常采用鏈式結構實現。


三、二叉樹的基本概念

  1. 定義
    二叉樹是每個節點最多有兩個子樹(左子樹和右子樹)的樹結構。這兩個子樹有先后順序,不能顛倒。二叉樹可能為空,也可能只有一個根節點。

  2. 特點

    • 節點度最大為 2;

    • 必須區分左子樹和右子樹,即使只有一個孩子;

    • 子樹順序不可交換。

  3. 二叉樹的五種基本形態

    • 空二叉樹;

    • 只有根節點;

    • 只有左子樹;

    • 只有右子樹;

    • 同時有左右子樹。


四、特殊的二叉樹

  1. 斜樹

    • 左斜樹:每個節點只有左子樹;

    • 右斜樹:每個節點只有右子樹。

  2. 滿二叉樹
    滿足:

    • 所有非葉子節點都有左右兩個子樹;

    • 所有葉子節點都在同一層;

    • 特點:整棵樹結構完全對稱,節點數最多。

  3. 完全二叉樹
    滿足:

    • 葉子只出現在最下兩層;

    • 最下層葉子靠左連續;

    • 最后一層若不滿,葉子也必須靠左;

    • 同樣節點數下,深度最小。


五、二叉樹的性質(重點公式)

  1. i 層最多有 2^(i-1) 個節點(i≥1)

  2. 深度為 k 的二叉樹最多有 2^k - 1 個節點

  3. 葉子數 = 度為 2 的節點數 + 1

  4. n 個節點的完全二叉樹深度為 log?(n) + 1

  5. 編號為 i 的節點:

    • i=1,它是根節點;

    • 左孩子編號為 2i

    • 右孩子編號為 2i + 1(若存在);

    • 雙親編號為 i / 2(i > 1 時)。


六、二叉樹的遍歷方式

  1. 前序遍歷:根 → 左 → 右

  2. 中序遍歷:左 → 根 → 右

  3. 后序遍歷:左 → 右 → 根

注:遍歷時雖然“根”在描述中寫在前面,但實際執行順序是遞歸的,需要先進入子樹再處理根節點。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>typedef char DataType;typedef struct BiTNode
{DataType data;struct BiTNode *lchild;struct BiTNode *rchild;
}BiTNode;char data[] = "Abd#g###ce#h##fi###";int ind = 0;void CreateTree(BiTNode **root)
{char c = data[ind++];if('#' == c){*root = NULL;return ;}else{*root = malloc(sizeof(BiTNode));if(*root == NULL){printf("malloc errror\n");*root = NULL;return ;}(*root)->data = c;CreateTree(&(*root)->lchild);CreateTree(&(*root)->rchild);}return ;
}
//根左右
void PreOrderTraverse(BiTNode *root)
{if(NULL == root){return ;}else{printf("%c", root->data);PreOrderTraverse((*root).lchild);PreOrderTraverse((*root).rchild);}return ;
}
//左根右
void InOrderTraverse(BiTNode *root)
{if(NULL == root){return ;}else{InOrderTraverse(root->lchild);printf("%c", root->data);InOrderTraverse(root->rchild);return ;}
}//左右根
void PostOrderTraverse(BiTNode *root)
{if (NULL == root){return;}PostOrderTraverse(root->lchild);PostOrderTraverse(root->rchild);printf("%c", root->data);return;
}void DestroyTree(BiTNode *root)
{if (NULL == root){return;}DestroyTree(root->lchild);DestroyTree(root->rchild);free(root);root = NULL;return;
}int main(int argc, char const *argv[])
{BiTNode *root;CreateTree(&root);PreOrderTraverse(root);printf("\n");InOrderTraverse(root);printf("\n");PostOrderTraverse(root);printf("\n");DestroyTree(root);root = NULL;return 0;
}

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

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

相關文章

《Linux運維總結:Shell 腳本日志輸出工具》

總結&#xff1a;整理不易&#xff0c;如果對你有幫助&#xff0c;可否點贊關注一下&#xff1f; 更多詳細內容請參考&#xff1a;Linux運維實戰總結 一、Shell 腳本日志輸出工具 1、提供的 logger() 函數是一個非常實用的 Shell 腳本日志輸出工具&#xff0c;它支持帶時間戳和…

select ... for update阻塞

總結阻塞規則&#xff1a;當前事務持有的鎖 (來自 SELECT ... FOR UPDATE)其他事務嘗試的操作是否會被阻塞&#xff1f;原因排他鎖 (X Lock) 在行 R 上SELECT ... FROM ... (普通查詢)否讀快照 (MVCC)&#xff0c;不需要鎖排他鎖 (X Lock) 在行 R 上SELECT ... FROM ... FOR UP…

LangChain4j終極指南:Spring Boot構建企業級Agent框架

LangChain4j Spring Boot 構建企業級 Agent 框架深度指南&#xff08;3000字終極版&#xff09;一、架構設計&#xff1a;面向未來的企業級智能體系統1.1 分層架構設計1.2 核心組件職責1.3 企業級特性設計二、核心模塊深度實現2.1 智能體協作引擎&#xff08;LangGraph4j高級應…

前端基礎之《Vue(29)—Vue3 路由V4》

一、安裝1、命令cnpm install vue-router42、配置映射為src路徑&#xff08;1&#xff09;安裝對應配置cnpm install types/node&#xff08;2&#xff09;配置vite.config.tsimport { defineConfig } from vite import vue from vitejs/plugin-vue import * as path from &quo…

9.2 通過DuEDrawingControl把eDrawing嵌入到C#中顯示

本文介紹如何通過DuEDrawingControl控件在C#的WPF中進行3D的顯示。 DuEDrawingControl在實際應用中可以應用于以下場景: 1.CAD文件預覽:在Winform或WPF應用程序中,用戶可以預覽裝配文件、工程圖文件等,方便進行設計和審核。 2.打印管理:控件支持打印文件的管理,用…

《Vuejs設計與實現》第 13 章(異步組件和函數式組件

目錄 13.1 異步組件的問題與解決方法 13.2 異步組件的實現原理 3.2.1 封裝 defineAsyncComponent 函數 13.2.2 超時與 Error 組件 13.2.3 延遲與 Loading 組件 13.2.4 重試機制 13.3 函數式組件 13.4 總結 在第12章&#xff0c;我們深入探討了組件的基本含義和實現方式…

Python的七大框架對比分析

談到“Python 七大框架”時&#xff0c;通常指 Django、Flask、FastAPI、Tornado、Sanic、AIOHTTP 和 Pyramid 這七位“常駐嘉賓”。它們各有氣質&#xff0c;適合的場景也截然不同。1. DjangoDjango 像一輛全副武裝的重型越野&#xff1a;出廠就配好 ORM、后臺管理、權限、緩存…

Redis中String數據結構為什么以長度44為embstr和raw實現的分界線?

? 一道常見Redis面試題。 ? 在Redis的String數據結構中&#xff0c;當字符串的實際長度小于44且包含非整數字符時底層編碼方式為embstr。當超過44時使用raw底層編碼方式。 ? 那么為什么要以字符串的長度44為分界線呢&#xff1f; 信息一 ? 首先要分析embst…

告別人工巡查,校園空調管理邁入智能物聯高效時代

在“雙碳”戰略深入推進和智慧校園建設加速落地的背景下&#xff0c;學校空調的用電管理已經不再是“開與關”的簡單問題&#xff0c;而是涵蓋了能效優化、安全保障、智慧化管理的綜合課題。藍奧聲科技憑借LPIOT低功耗物聯網、ECWAN邊緣協同網絡等優勢技術&#xff0c;打造出面…

Access開發右下角浮窗提醒

Hi&#xff0c;大家好呀&#xff01;感覺又有很長一段時間沒有給大家更新內容了&#xff0c;最近一直在忙&#xff0c;給大家承諾的框架、視頻教程、直播等等感覺又要跳票了&#xff0c;嘿嘿&#xff0c;但大家還是不要急&#xff0c;莫催我&#xff0c;我會慢慢都更新出來的&a…

AI自進化,GPU性能翻三倍——CUDA-L1開啟自動優化新范式

最近看到一篇讓我挺震撼的文章&#xff0c;來自 DeepReinforce 團隊發布的一個新框架——CUDA-L1。說實話&#xff0c;剛看到標題說“AI 讓 GPU 性能提升 3 倍以上”&#xff0c;我心里是有點懷疑的。畢竟我們搞科研的都知道&#xff0c;這種宣傳語很多時候水分不小。但當我靜下…

深入理解 Java AWT Container:原理、實戰與性能優化

以 Container 為核心梳理 AWT 容器體系與事件模型&#xff0c;提供可運行的純 AWT 示例&#xff08;含 Panel、Frame、Dialog、ScrollPane 正確用法&#xff09;&#xff0c;并給出常見問題與性能優化建議。 Java AWT, Container, 容器, 布局管理器, 事件驅動, ScrollPane, 性…

redis--黑馬點評--用戶簽到模塊詳解

用戶簽到假如我們使用一張表來存儲用戶簽到信息&#xff0c;其結構應該如下&#xff1a;CREATE TABLE tb_sign (id bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 主鍵,user_id bigint unsigned NOT NULL COMMENT 用戶id,year year NOT NULL COMMENT 簽到的年,month tinyin…

Shell、Python對比

在 Shell 腳本&#xff08;sh/bash&#xff09; 和 Python 之間選擇時&#xff0c;主要取決于具體的使用場景和需求。以下是兩者的對比分析&#xff0c;幫助你判斷哪種更方便&#xff1a;1. Shell 腳本&#xff08;sh/bash&#xff09;的優勢適用場景系統管理任務&#xff1a;如…

自適應反步控制:理論與設計

自適應反步控制 文章目錄自適應反步控制1. 基本思想A. 第一步B. 第二步1. 基本思想 基于傳統反步法&#xff0c;考慮了系統方程中以線性形式出現的未知參數。核心思想包括參數估計率和控制率。 考慮二階系統&#xff1a; {x˙1x2φ1T(x1)θx˙2uφ2T(x1,x2)θ(1)\begin{cases…

[Oracle] LEAST()函數

LEAST() 是 Oracle 中一個非常有用的函數&#xff0c;用于從一組表達式中返回最小值LEAST()函數會從給定的參數列表中返回最小的值&#xff0c;它與GREATEST()函數正好相反語法格式LEAST(expr1, expr2 [, expr3, ...])參數說明expr1, expr2, ...&#xff1a;要比較的表達式(至少…

SVM算法實戰應用

目錄 用 SVM 實現鳶尾花數據集分類&#xff1a;從代碼到可視化全解析 一、算法原理簡述 二、完整代碼實現 三、代碼解析 1. 導入所需庫 2. 加載并處理數據 3. 劃分訓練集和測試集 4. 訓練 SVM 模型 5. 計算決策邊界參數 6. 生成決策邊界數據 7. 繪制樣本點 8. 繪制…

深度虛值期權合約有什么特點?

本文主要介紹深度虛值期權合約有什么特點&#xff1f;深度虛值期權合約是期權市場中一類特殊且風險收益特征鮮明的合約&#xff0c;其核心特點可歸納為以下六點。深度虛值期權合約有什么特點&#xff1f;一、定義&#xff1a;執行價與標的價差距極大深度虛值期權是指執行價&…

(LeetCode 面試經典 150 題) 86. 分隔鏈表(鏈表+雙指針)

題目&#xff1a;86. 分隔鏈表 思路&#xff1a;雙指針&#xff0c;時間復雜度0(n)。 雙指針來維護小于x的鏈表和不小于x的鏈表即可&#xff0c;后面將兩個鏈表連起來即可。 C版本&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* …

安全掃描:檢測到目標站點存在javascript框架庫漏洞問題(vue)

如果升級Vue版本有限制或者時間比較緊急&#xff0c;可以暫時用下面方式來&#xff0c;規避檢測到目標站點存在javascript框架庫vue漏洞。 在 vue.config.js 中配置: module.exports {configureWebpack: {optimization: {minimizer: [new (require(terser-webpack-plugin))({t…