資料結構與演算法 C語言描述 樹和二叉樹的概念和定義

2022-08-31 10:03:07 字數 3339 閱讀 7321

在生活中,線結構是最基本並且也是最常用的,但是有許多邏輯關係並不是簡單的線性關係,在實際的場景中,往往存在一對多甚至是多對多的情況。

這時就需要非線性結構了,而樹結構則是一類重要的非線性結構,樹是以分支關係定義的層次結構,並且在現實生活中有廣泛的應用。

比如說人類社會的家譜:

滿 門 忠 烈

機構裡的職級關係也可以用樹表示:

還有許多抽象的東西也可以表示成一棵樹,比如說作業系統中的檔案目錄的組織結構、一本書的目錄:

這種結構類似於自然界中的樹一樣,從根裡衍生出許多枝幹,再從枝幹中衍生出許多更小的枝幹,最後衍生出更多的葉子。

樹的定義

樹(tree)是n(n>=0)個結點的有限集。

​ 當n=0(即無結點)時,稱為空樹,空樹是樹的特例。

​ 當n>0時為非空樹,對於非空樹:

必有且只有乙個稱之為(root)的結點。

除根結點以外的n-1個結點可以劃分為m個根的子樹(subtree)。

樹其實也是一種遞迴的實現,即樹的定義之中還用到了樹的概念。

對比線性表和樹的結構,他們有很大的不同。

線性結構

樹結構第乙個資料元素:無前驅

根結點:無雙親,唯一

最後乙個資料元素:無後繼

葉結點:無孩子,可以多個

中間元素:乙個前去乙個後繼

中間節點:乙個雙親多個孩子

樹的固有特性

樹的基本術語

結點:樹中的乙個個獨立單元。包含乙個資料元素和若干指向其他節點的分支資訊。

結點的度(de-gree):乙個結點的子樹個數。

樹的度:樹內各結點度的最大值。

因為這棵樹結點的度的最大值是結點d的度,為3,所以樹的度也為3。

葉結點(leaf):度為0的節點,即無後繼的結點稱為葉結點或終端結點

分支結點:度不為0的結點,又稱為非終端結點,除根結點外,非終端節點也稱為內部節點

結點的層次(level):從根結點開始定義,根結點的層次為1,根的直接後繼的層次為2,依此類推。

結點的層序編號:將樹中的結點按照從上到下,同層按照從左到右的次序排成乙個線性序列,依次給他們編以從1開始的連續的自然數。

樹的高度/深度(depth):樹中所有結點的層次的最大值,圖中的樹深度為4。

森林(forest):m(m>=0)棵互不相交的樹的集合。對樹中每個結點而言,其子樹的集合即為森林。將一棵非空非最小樹的樹根結點刪去,樹就變成乙個森林。

孩子結點(child):乙個結點的直接後繼稱為該結點的孩子節點。

雙親結點(parent):乙個結點的直接前驅稱為該節點的雙親結點。

兄弟結點(sibling):同一雙親結點的孩子之間互相稱為兄弟結點。

有序樹:將樹中結點的各子樹看成從左到右是有先後次序的(不能互換),則稱為有序樹,否則稱為無序樹

二叉樹的定義

滿足以下兩個條件的樹形結構稱為二叉樹(binary tree):

每個結點最多有兩棵子樹(即不存在度大於2的結點)。

二叉樹的子樹有左右之分,其次序不能任意顛倒,即使樹中某結點只有一棵子樹,也要區分它是左子樹還是右子樹。

二叉樹結點的兩個孩子結點,左邊的被稱為左孩子(left child),右邊的被稱為右孩子(right child)。兩個孩子結點也有左右之分,次序不能任意顛倒。

二叉樹的五種基本形態:

前面有關樹的術語都適用於二叉樹。

二叉樹的性質

在二叉樹的第i層上(i從1開始計數)最多有2i-1個結點(i>=1)。

高度為k的二叉樹最多有2k-1個結點(k>=1)。

具有n(n>=1)個結點的完全二叉樹的高度最多為n,最少為(log2n)+1。

對任何一棵二叉樹,如果其葉結點有n個,度為2的結點有m個,則有:n=m+1。

如果對一棵有n個結點的完全二叉樹(其深度為(log2n)+1)的結點按層序編號(從第一層到(log2n)+1層,每層從左到右),對任一結點i(1<=i<=n)有:

n個結點可以組成1/(n+1)*[(2n)!/(n!*n!)]種不同構的二叉樹。

特殊二叉樹

滿二叉樹:在一棵二叉樹中,如果所有分支(非葉子結點)都存在左子樹和右子樹,並且所有的葉子都在同一層上(高度為k的二叉樹且有2k-1個結點)。

說白了就是每個分支都是滿的。

完全二叉樹:把一棵具有n個結點的二叉樹按層序編號,如果編號為i(1<=i<=n)的結點和同樣深度的滿二叉樹中編號i的節點在二叉樹中位置完全相同,那麼這棵二叉樹被稱為完全二叉樹。也可以理解為把一棵滿二叉樹的最後一層結點,從左向右連續卻掉若干個結點,那麼它就是完全二叉樹。

(可以看到這個二叉樹編號從1到12的12個結點和上圖的二叉樹的12個結點的位置完全對應,所以這個樹是完全二叉樹。)

滿二叉樹一定是完全二叉樹,但完全二叉樹不一定是滿二叉樹。

在完全二叉樹或滿二叉樹中,如果某個結點沒有左兒子,那麼他一定沒有右兒子(即該結點是乙個葉結點)。

資料結構與演算法分析 C語言描述

第一種方法,先進行排序,再返回位置k上的元素。簡單排序問題 第二種方法,先將前k個元素讀入,再將剩下的元素逐個讀入,如果新元素大於陣列中第k個元素就找到他合適的位置並將陣列中的乙個元素擠出。第三種方法,利用快排的特點 假設預設公升序排序 每一次快排操作都能確定乙個數在排序結果中的最終固定位置,即該位...

資料結構與演算法分析 c 語言描述

編寫帶有下列宣告的兩個例程 void permute string str void permute char str,int low,int high 第乙個例程是個驅動程式,它呼叫第二個例程並顯示string str中字元的所有排列。例如,str是 abc 那麼輸出的串則是abc,acb,bac...

《資料結構與演算法分析(C 語言描述)》

第1章 uml教程 更多軟體恐怖故事 nist新聞稿 軟體錯誤每年給美國經濟造成595億美元的損失 nist報告本身 pdf 第2章 ieee對實數的反感 c 的按位運算子 第3章 工會 記憶體結構 第5章模式匹配 資料加密 第9章用位集實現集 有關valarrays的更多資訊 第10章 用於解析表...