數據結構 -- 二叉樹的存儲結構

二叉樹的存儲結構

順序存儲

#define MaxSize 100
struct TreeNode{ElemType value;		//結點中的數據元素bool isEmpty;		//結點元素是否為空
};//定義一個長度為MaxSize的數組t,按照從上至下、從左至右的順序依次完成存儲完全二叉樹中的各個節點
TreeNode t[MaxSize];
for (int i = 0;i<MaxSize;i++){t[i].isEmpty = true;		//初始化所有結點為空
}

幾個重要常考的基本操作:

i 的左孩子 – 2i

i 的右孩子 – 2i+1

i 的父節點 – [i/2]

i 所在的層次 – [log2(n+1)]或[log2n]+1

【注意】如果是一顆普通的二叉樹,依然按照層序將各節點順序存儲,那么結點間是沒有上述的對應關系的

?所以在二叉樹的順序存儲中,一定需要將二叉樹的節點編號與完全二叉樹對應起來

【存在問題】在最壞情況下,高度為h的且只有h個節點的單只樹(所有結點只有右孩子),也至少需要2^h-1個存儲單元

鏈式存儲

//二叉樹的結點(鏈式存儲)
typedef struct BiTNode{ElemType data;						//數據域struct BiTNode * lchild,*rchild;	//左右孩子
}BiTNode,*BiTree;

?n個結點的二叉鏈表共有n+1個空鏈域(可以用于構造線索二叉樹)

struct ElemType{int value;
};typedef struct BiTNode{ElemType data;						//數據域struct BiTNode *lchild,*rchild;		//左右孩子指針
}BiTNode,*BiTree;//定義一顆空樹
BiTree root = NULL://插入根結點
root = (BiTree)malloc(sizeof(BiTNode));
root->data = {1};
root->lchild = NULL;
root->rchild = NULL;//插入新結點
BiTNode *p = (BiTNode*)malloc(sizeof(BiTNode));
p->data = {2};
p->lchild = NULL;
p->rchild = NULL;
root ->lchild = p;		//作為根結點的左孩子

找到指定結點p的左右孩子 – p->lchild; p->rchild;

找到指定結點p的父節點 – 只能從根節點開始遍歷

【解決】如果經常需要尋找父節點,可以使用三叉鏈表(添加一個父結點指針)

//二叉樹的結點(鏈式存儲)
typedef struct BiTNode{ElemType data;						//數據域struct BiTNode *lchild,*rchild;		//左右孩子指針struct BiTNode *parent;				//父結點指針(根據實際需要決定要不要添加)
}BiTNode,*BiTree;

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

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

相關文章

Linux系統移植篇(十一)Linux 內核啟動流程

要分析 Linux 啟動流程&#xff0c;同樣需要先編譯一下 Linux 源碼&#xff0c;因為有很多文件是需要編譯才 會生成的。首先分析 Linux 內核的連接腳本文件 arch/arm/kernel/vmlinux.lds&#xff0c;通過鏈接腳本可以 找到 Linux 內核的第一行程序是從哪里執行的。vmlinux.lds …

【Docker入門】構建推送第一個Docker映像

【Docker入門】構建推送第一個Docker映像 Build and Push the First Docker Image By JacksonML Docker的容器(Container)映像是輕量級的可執行獨立包&#xff0c;包含代碼、運行時、庫、環境變量以及配置文件&#xff0c;它對于運行軟件至關重要。注冊表可在團隊間分享映像。…

【eNSP實戰】(續)一個AC多個VAP的實現—將隧道轉發改成直接轉發

在 一個AC多個VAP的實現—CAPWAP隧道轉發 此篇文章配置的基礎上&#xff0c;將隧道轉發改成直接轉發 一、改成直接轉發需要改動的配置 &#xff08;一&#xff09;將連接AP的接口改成trunk口&#xff0c;并允許vlan100、101、102通過 [AC1]interface GigabitEthernet 0/0/8 …

SPI 總線協議

1、協議介紹 SPI&#xff0c;是英語 Serial Peripheral interface 的縮寫&#xff0c;顧名思義就是串行外圍設備接口。是 Motorola 首先在其 MC68HCXX 系列處理器上定義的。 SPI&#xff0c;是一種高速的&#xff0c;全雙工&#xff0c;同步的通信總線。主節點或子節點的數據在…

我愛學算法之——滑動窗口攻克子數組和子串難題(上)

現在來學習"滑動窗口"這一算法思想。 至于什么是"滑動窗口"呢&#xff1f;簡單來說就是同向雙指針&#xff1b;現在來通過題目來了解什么是"滑動窗口" 一、長度最小的子數組 題目鏈接&#xff1a;長度最小的子數組 題目解析 先來看題目&#…

ora-600 ktugct: corruption detected---惜分飛

接手一個oracle 21c的庫恢復請求,通過Oracle數據庫異常恢復檢查腳本(Oracle Database Recovery Check)腳本檢測之后,發現undo文件offline之后,做了resetlogs操作,導致該文件目前處于WRONG RESETLOGS狀態 嘗試恢復數據庫ORA-16433錯誤 SQL> recover datafile 1; ORA-00283:…

20. Excel 自動化:Excel 對象模型

一 Excel 對象模型是什么 Excel對象模型是Excel圖形用戶界面的層次結構表示&#xff0c;它允許開發者通過編程來操作Excel的各種組件&#xff0c;如工作簿、工作表、單元格等。 xlwings 是一個Python庫&#xff0c;它允許Python腳本與Excel進行交互。與一些其他Python庫&#x…

IIS 服務器日志和性能監控

Internet Information Services &#xff08;IIS&#xff09; 是 Microsoft 提供的一款功能強大、靈活且可擴展的 Web 服務器&#xff0c;用于托管網站、服務和應用程序。IIS 支持 HTTP、HTTPS、FTP、SMTP 和更多用于提供網頁的協議&#xff0c;因此廣泛用于企業環境。 IIS 的…

jenkins pipline 自動化測試

以下是一個典型的 Jenkins Pipeline 示例&#xff0c;用于執行自動化測試流程&#xff08;支持單元測試、集成測試、代碼質量掃描&#xff09;&#xff0c;包含多階段執行和測試結果處理&#xff1a; pipeline {agent anyenvironment {// 定義環境變量PROJECT_NAME "my-…

APP測試

一、APP測試范圍 功能測試性能測試&#xff1a;CPU、內存占用、啟動速度、流量、電量消耗、流暢度、穩定性專項測試&#xff1a;安裝卸載升級、push消息推送 、交叉事件測試 、用戶體驗測試 、兼容性測試 二、APP包發布方式及策略 分類&#xff1a; 內部發布渠道。如&#x…

12 File文件對象:創建、獲取基本信息、遍歷文件夾、查找文件;字符集的編解碼 (黑馬Java視頻筆記)

文章目錄 File >> 存儲數據的方案1. 認識File2. File操作2.1 創建File對象2.2 File操作1&#xff09;對文件對象的信息的操作2&#xff09;文件/文件夾的創建/刪除3&#xff09;??對文件夾的遍歷 3. 方法遞歸3.1 認識遞歸3.2 遞歸算法及其執行流程1) 案例&#xff1a;2…

oracle 基礎知識之 多表查詢

多表查詢定義&#xff1a;當查詢的數據并不是來源一個表時&#xff0c;需要使用多表連接操作完成查詢。多表連接查詢通過表之間的關聯字段&#xff0c;一次查詢出多個表的數據。多表查詢包括了等值連接、左連接、右連接、完全連接。 1.等值連接 等值連接也稱為簡單連接&#xf…

服務器防火墻根據什么特征來過濾數據包?

防火墻是服務器安全防護的第一道屏障&#xff0c;它的主要作用是監控、過濾和控制進出服務器的數據流量&#xff0c;防止惡意攻擊、非法訪問和數據泄露。防火墻通過分析數據包的特定特征來決定是否允許、拒絕或限制數據的傳輸。 服務器防火墻的基本工作原理&#xff1a; 防火墻…

Prims region.Views 為null

原因&#xff1a; 導航未完成或異步問題 解決方式&#xff1a;使用回調確認導航完成后再操作視圖 _regionManager.RequestNavigate("MonitorRegion", "MonitorView", nps, navigationResult > {if (navigationResult.Result true){var region _regio…

reconstruct_3d_object_model_for_matching例子

文章目錄 1.獲取om3文件2.準備可視化3.準備3D可視化4.讀取3D模型5.顯示成對注冊結果16.顯示成對注冊結果27.聯合注冊模型8.處理圖像8.1子采樣8.2 圖像計算與平滑8.3 三角測量 9.基于表面做3D匹配10.評估模型準確度10.1 在場景中找到模型10.2 計算模型和場景之間的距離 11.立體系…

軟件安全性測試的重要性和常用工具介紹,軟件測試服務公司推薦

在當今數字化快速發展的時代&#xff0c;軟件已經成為各行各業不可或缺的一部分。然而&#xff0c;隨著軟件系統的復雜性增加&#xff0c;安全性問題也愈發突出&#xff0c;因此軟件產品生產周期中安全測試必不可少。軟件安全性測試是指對軟件系統進行評估&#xff0c;以發現潛…

Redis項目:短信驗證碼登錄

這是黑馬的黑馬點評項目&#xff0c;短信驗證碼的業務。一開始是使用session做的&#xff0c;后來重構&#xff0c;使用redis緩存來完成。 第一層攔截器&#xff1a; public class RefreshTokenInterceptor implements HandlerInterceptor {private StringRedisTemplate stri…

Docker下載,包含Win、Mac

介紹 Docker 是一種開源的容器化平臺&#xff0c;通過操作系統級虛擬化技術實現應用的快速開發、部署和運行。以下從多個維度對 Docker 進行詳細介紹&#xff1a; 一、Docker 的核心概念與功能 容器化技術 Docker 利用 Linux 內核的容器隔離技術&#xff08;如 Cgroups 和 Nam…

使用 ESP8266 和 Android 應用程序實現基于 IOT 的語音控制家庭自動化

使用 ESP8266 實現基于 IOT 的語音控制家庭自動化 歡迎來到另一個令人興奮的項目,我們將使用 Wi-Fi 模塊構建一個語音控制ESP8266家庭自動化系統,您可以在其中通過語音通過 Android 應用程序從世界任何地方控制您的家用電器。是的,您只需使用語音命令即可打開或關閉負載(L…

【HarmonyOS Next】鴻蒙中自定義彈框OpenCustomDialog、CustomDialog與DialogHub的區別詳解

【HarmonyOS Next】鴻蒙中自定義彈框OpenCustomDialog、CustomDialog與DialogHub的區別詳解 一、三者的區別與關系 1. 官方迭代過程為&#xff1a; CustomDialog 》 OpenCustomDialog 》 DialogHub 迭代過程表明&#xff0c;彈框的調用越來越便捷&#xff0c;與UI解耦&…