數據結構(超詳細講解!!)第二十四節 二叉樹(上)

1.定義

二叉樹(Binary Tree)是另一種樹型結構。 ? ?

二叉樹的特點:

1)每個結點至多只有兩棵子樹(即二叉樹中不存在度大于2的結點);

2)二叉樹的子樹有左右之分,其次序不能任意顛倒。 ? ?

二叉樹的遞歸定義 ?

二叉樹(BinaryTree)是n(n≥0)個結點的有限集。它或者是空集(n=0),或者同時滿足以下兩個條件:?

(1) 有且僅有一個根結點; ?

(2) 其余的結點分成兩棵互不相交的左子樹和右子樹。

二叉樹的抽象數據類型 ? ADT BinaryTree { ?D、R、P ? }

?二叉樹與樹有區別:樹的子樹沒有順序,但如果二叉樹的根結點只有一棵子樹,必須明確區分它是左子樹還是右子樹,因為兩者將構成不同形態的二叉樹。因此,二叉樹不是樹的特例。它們是兩種不同的數據結構。

二叉樹有5種基本形態:

2.性質

性質1:若二叉樹的層次從1開始, 則在二叉樹的第 i 層最多有 2i-1 個結點。(i ? 1)

性質2:深度為k的二叉樹至多有2k-1個結點(k>0)。

性質3:對于任何一棵二叉樹,若度2的結點數有n2個,葉子結點數為n0,則n0=n2+1。

特例:

1)滿二叉樹:深度為k且有 2k-1個結點的二叉樹。

特點:每一層上的結點數都是最大結點數。滿二叉樹不存在度數為1的節點,且樹葉都在最下一層。可以對滿二叉樹的結點進行連續編號。

2)完全二叉樹:深度為k,有n個結點的二叉樹,當且僅當其每一個結點都與深度為k的滿二叉樹中編號從1至n 的結點一一對應時,稱之為完全二叉樹。

特點:

(1)葉子結點只可能在層次最大的兩層上出現; ? ? ? ? ? ? ?

(2)對任一結點,若其右分支下的子孫的最大層次為h,則其左分支下的子孫的最大層次數必為h或h+1。

對于特殊性質的二叉樹,還具備以下2個性質:

性質4:具有n個結點的完全二叉樹的深度必為log2n+1。

性質5:如果對一棵有n個結點的完全二叉樹(其深度為log2n+1)的結點按層序編號,則對任一結點i(1≤i≤n),有:

1)如果i=1,則結點i是二叉樹的根,無雙親;如果i>1,則其雙親parent(i)是結點?i/2 ; ? ? ? ?

2)如果2i>n,則結點i無左孩子(結點i為葉子結點);否則其 左孩子lchild(i)是結點2i; ? ? ? ?

3)如果2i+1>n,則結點i無右孩子;否則其右孩子rchild(i) 是結點2i+1。

3.存儲結構

1.順序存儲結構

?二叉樹的順序存儲,是采用一組連續的存儲單元來存放二叉樹中的結點,但是,由于二叉樹是非線性結構,所以結點之間的邏輯關系難以從存儲的先后確定。不過,由二叉樹的性質5可知,對于完全二叉樹,如果按照從上(根結點)到下(葉結點)和從左到右的順序,對二叉樹中的所有結點從0到n-1編號,這樣存放到一維數組中。只要通過數組元素的下標關系,就可以確定二叉樹中結點之間的邏輯關系。

#define  MAXSIZE  100	
typedef  int  ElemType;	
typedef struct wqbtree
{ElemType SequenBiTree[MAXSIZE];int n;		/*記錄節點總數*/
}Fbitree;

對于一般的二叉樹,如果仍采用順序表示,首先要對它進行擴充,增加一些并不存在的空結點,使之成為一棵完全二叉樹,然后再用一維數組順序存儲。

缺點:浪費存儲空間。

完全二叉樹用順序存儲結構,一般二叉樹用鏈式存儲結構。

2.鏈表存儲結構

1.二叉鏈表

由于二叉樹每個結點至多只有2個孩子,分別為左孩子和右孩子。因此可以把每個結點分成三個域:一個域存放結點本身的信息,另外兩個是指針域,分別存放指向左、右孩子的指針。每個結點的結構表示為:

typedef  int  ElemType;	
typedef struct BiTreeNode
{ 	ElemType data;struct BiTreeNode *lchild, *rchild;
}BiTreeNode, *BiTree;

一個二叉鏈表由根指針root唯一確定。若二叉樹為空,則root=NULL;若結點的某個孩子不存在,則相應的指針為空。?

具有n個結點的二叉鏈表中,共有2n個指針域。其中只有n-1個用來指示結點的左、右孩子,其余的n+1個指針域為空。

?若一個二叉樹含有n個結點,則它的二叉鏈表中必含有2n個指針域, 其中必有n+1個空的鏈域。

2.三叉鏈表

為了便于找到結點的雙親,可以在結點結構中增加一個指向其雙親結點的指針域,此時二叉鏈表變為三叉鏈表。 三叉鏈表的結點結構

typedef  int  ElemType;
typedef struct ThrTreeNode{ElemType data;struct ThrTreeNode  *lchild, *rchild,*parent;
}ThrTreeNode, *ThrTree;

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

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

相關文章

python爬蟲教程:selenium常用API用法和瀏覽器控制

文章目錄 selenium apiwebdriver常用APIwebelement常用API 控制瀏覽器 selenium api selenium新版本(4.8.2)很多函數,包括元素定位、很多API方法均發生變化,本文記錄以selenium4.8.2為準。 webdriver常用API 方法描述get(String url)訪問目標url地址&…

分布式鎖之傳統鎖回顧(一)

1. 傳統鎖回顧 1.1. 從減庫存聊起 多線程并發安全問題最典型的代表就是超賣現象 庫存在并發量較大情況下很容易發生超賣現象,一旦發生超賣現象,就會出現多成交了訂單而發不了貨的情況。 場景: 商品S庫存余量為5時,用戶A和B同…

python:可迭代的數據類型、可變的數據類型、不可變的數據類型

python:可迭代的數據類型、可變的數據類型、不可變的數據類型 文章目錄 python:可迭代的數據類型、可變的數據類型、不可變的數據類型可迭代的數據類型可變的數據類型不可變的數據類型 可迭代的數據類型 序列:str、bytes、tuple、list非序列…

PC8223(CC/CV控制)高耐壓輸入5V/3.4A同步降壓電路內建補償帶恒流恒壓輸出

概述 PC8233(替代CX8853)是一款同步降壓調節器,輸出電流高達3.4A,操作范圍從8V到32V的寬電源電壓。內部補償要求最低數量現成的標準外部組件。PC8233在CC(恒定輸出電流)模式或CV(恒定輸出電壓)模式&#x…

莫托曼機器人測溫程序

1機器程序 2.1 主程序 MAIN: NOP CALL JOB:ORG *1 JUMP *5 IF IN#(41)OFF CALL JOB:遠程 IF IN#(25)ON CALL JOB:本地 IF IN#(26)ON CALL JOB:測距判斷 CALL JOB:最后一支 *5 CALL JOB:PZ IF IN#(35)ON CALL JOB:PZ IF IN#(65)ON JUMP *1 END 1.2 本地程序 1、本地…

代碼隨想錄算法訓練營Day 60 || 84.柱狀圖中最大的矩形

84.柱狀圖中最大的矩形 力扣題目鏈接(opens new window) 給定 n 個非負整數&#xff0c;用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰&#xff0c;且寬度為 1 。 求在該柱狀圖中&#xff0c;能夠勾勒出來的矩形的最大面積。 1 < heights.length <10^50 < hei…

CVE-2022-0543(Redis 沙盒逃逸漏洞)

簡介 CVE-2022-0543是一個與Redis相關的安全漏洞。在Redis中&#xff0c;用戶連接后可以通過eval命令執行Lua腳本&#xff0c;但在沙箱環境中腳本無法執行命令或讀取文件。然而&#xff0c;攻擊者可以利用Lua沙箱中遺留的變量package的loadlib函數來加載動態鏈接庫liblua5.1.s…

VirtualBox下win主機如何訪問linux虛擬機文件夾

目錄 ?編輯 方法1&#xff1a;通過VirtualBox自帶的共享文件夾&#xff08;Win->linux&#xff09; 方法2&#xff1a;通過Samba方法本地網絡訪問(Linux->win) 我使用的VirtualBox版本為7.0.4,主機是Window系統&#xff0c;虛擬機是Linux系統 方法1&#xff1a;通過Vir…

【SpringBoot篇】Spring_Task定時任務框架

文章目錄 &#x1f339;概述&#x1f33a;應用場景&#x1f384;cron表達式&#x1f6f8;入門案例&#x1f38d;實際應用 &#x1f339;概述 Spring Task 是 Spring 框架提供的一種任務調度和異步處理的解決方案。可以按照約定的時間自動執行某個代碼邏輯它可以幫助開發者在 S…

PTA-快速冪

要求實現一個遞歸函數&#xff0c;高效求ab(1≤a,b≤62,ab<263)。 函數接口定義&#xff1a; long long int pow(int a, int b); 其中a 、b 是用戶傳入的參數。 裁判測試程序樣例&#xff1a; #include<iostream> using namespace std; long long int pow(int a,…

數據結構 棧與隊列

棧 棧是一種 后進先出&#xff08; LIFO&#xff09; 的數據結構&#xff0c;它是一種線性的、有序的數據結構。棧的基本操作有兩個&#xff0c;即入棧和出棧。入棧指將元素放入棧頂&#xff0c;出棧指將棧頂元素取出。棧的本質是一個容器&#xff0c;它可以存儲任何類型的數…

String轉Date,Date轉String

源碼&#xff1a; Date currentTime new Date();System.out.println("currentTime:"currentTime);SimpleDateFormat formatter new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateString formatter.format(currentTime);System.out.println(&quo…

【深度學習】學習率及多種選擇策略

學習率是最影響性能的超參數之一&#xff0c;如果我們只能調整一個超參數&#xff0c;那么最好的選擇就是它。相比于其它超參數學習率以一種更加復雜的方式控制著模型的有效容量&#xff0c;當學習率最優時&#xff0c;模型的有效容量最大。本文從手動選擇學習率到使用預熱機制…

qt msvc2010 qdatetime.h:122: error: C2589: “(”:“::”右邊的非法標記

報錯內容&#xff1a; C:\Qt\Qt5.4.0\5.4.0\msvc2010_opengl\include\QtCore\qdatetime.h:114: error: C2589: “(”:“::”右邊的非法標記 C:\Qt\Qt5.4.0\5.4.0\msvc2010_opengl\include\QtCore\qdatetime.h:114: error: C2059: 語法錯誤:“::” 解決方法&#xff1a; 打開qd…

2023小紅書Android面試之旅

一面 自我介紹 看你寫了很多文章&#xff0c;拿你理解最深刻的一篇出來講一講 講了Binder相關內容 Binder大概分了幾層 哪些方法調用會涉及到Binder通信 大概講一下startActivity的流程&#xff0c;包括與AMS的交互 全頁面停留時長埋點是怎么做的 我在項目中做過的內容&am…

RocketMQ-NameServer詳解

前言 ? RocketMQ架構上主要分為四部分, Broker、Producer、Consumer、NameServer&#xff0c;其他三個都會與NameServer進行通信。 Producer: ? **消息發布的角色&#xff0c;可集群部署。**通過NameServer集群獲得Topic的路由信息&#xff0c;包括Topic下面有哪些Queue&a…

PTA-病毒感染檢測

人的DNA和病毒DNA均表示成由一些字母組成的字符串序列。然后檢測某種病毒DNA序列是否在患者的DNA序列中出現過&#xff0c;如果出現過&#xff0c;則此人感染了該病毒&#xff0c;否則沒有感染。例如&#xff0c;假設病毒的DNA序列為baa&#xff0c;患者1的DNA序列為aaabbba&am…

數據結構與算法編程題15

設計一個算法&#xff0c;通過遍歷一趟&#xff0c;將鏈表中所有結點的鏈接方向逆轉&#xff0c;仍利用原表的存儲空間。 #include <iostream> using namespace std;typedef int Elemtype; #define ERROR 0; #define OK 1;typedef struct LNode {Elemtype data; …

【從入門到起飛】JavaSE—多線程(3)(生命周期,線程安全問題,同步方法)

&#x1f38a;專欄【JavaSE】 &#x1f354;喜歡的詩句&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。 &#x1f386;音樂分享【如愿】 &#x1f384;歡迎并且感謝大家指出小吉的問題&#x1f970; 文章目錄 &#x1f354;生命周期&#x1f384;線程的安全問題&#…

【Leetcode合集】1410. HTML 實體解析器

1410. HTML 實體解析器 1410. HTML 實體解析器 代碼倉庫地址&#xff1a; https://github.com/slience-me/Leetcode 個人博客 &#xff1a;https://slienceme.xyz 編寫一個函數來查找字符串數組中的最長公共前綴。 如果不存在公共前綴&#xff0c;返回空字符串 ""…