樹的定義 基本術語

Bec_3發表於2020-11-19

1. 樹(Tree)的基本概念

1.1 樹的定義

樹是由結點或頂點和邊組成的(可能是非線性的)且不存在著任何環的一種資料結構。沒有結點的樹稱為空(null或empty)樹。一棵非空的樹包括一個根結點,還(很可能)有多個附加結點,所有結點構成一個多級分層結構。

1.2 樹的基本術語

RootThe top node in a tree.樹的頂端結點
ChildA node directly connected to another node when moving away from the Root.孩子當遠離根(Root)的時候,直接連線到另外一個結點的結點被稱之為孩子(Child); 
ParentThe converse notion of a child.雙親相應地,另外一個結點稱為孩子(child)的雙親(parent)。
SiblingsA group of nodes with the same parent.兄弟具有同一個雙親(Parent)的孩子(Child)之間互稱為兄弟(Sibling)。
AncestorA node reachable by repeated proceeding from child to parent.祖先結點的祖先(Ancestor)是從根(Root)到該結點所經分支(Branch)上的所有結點。
DescendantA node reachable by repeated proceeding from parent to child.子孫以某結點為根的子樹中的任一結點都稱為該結點的子孫(後代)。
LeafA node with no children.葉子(終端結點)沒有孩子的結點(也就是度為0的結點)稱為葉子(Leaf)或終端結點。
BranchA node with at least one child.分支(非終端結點)至少有一個孩子的結點稱為分支(Branch)或非終端結點。
DegreeThe number of sub trees of a node.結點所擁有的子樹個數稱為結點的度(Degree)。
EdgeThe connection between one node and another.一個結點和另一個結點之間的連線被稱之為邊(Edge)。
PathA sequence of nodes and edges connecting a node with a descendant.路徑連線結點和其後代的結點之間的(結點,邊)的序列。 
LevelThe level of a node is defined by 0 + (the number of connections between the node and the root).層次結點的層次(Level)從根(Root)開始定義起,根為第0層,根的孩子為第1層。以此類推,若某結點在第i層,那麼其子樹的根就在第i+1層。
Height of nodeThe height of a node is the number of edges on the longest path between that node and a leaf.結點的高度結點的高度是該結點和某個葉子之間存在的最長路徑上的邊的個數。 
Height of treeThe height of a tree is the height of its root node.樹的高度樹的高度是其根結點的高度。 
Depth of nodeThe depth of a node is the number of edges from the tree's root node to the node.結點的深度結點的深度是從樹的根結點到該結點的邊的個數。 (注:樹的深度指的是樹中結點的最大層次。)
ForestA forest is a set of n ≥ 0 disjoint trees.森林森林是n(>=0)棵互不相交的樹的集合。

2  二叉樹(Binary Tree)

2.1  什麼是二叉樹(Binary Tree)

每個結點至多擁有兩棵子樹(即二叉樹中不存在度大於2的結點),並且,二叉樹的子樹有左右之分,其次序不能任意顛倒。

2.2  二叉樹的性質

(1)若二叉樹的層次從1開始,則在二叉樹的第i層,不超過2^(i-1)個結點(i>=0)。

(2)對任何一棵二叉樹,如果其葉結點數為N0,而度數為2的結點總數為N2,則N0=N2+1;

(3)深度為h的二叉樹最多有2^h-1個結點(h>=1),最少有h個結點;

(4)具有n個結點的完全二叉樹的深度為int(log2n)+1

 

3  儲存方式

儲存的方式和圖一樣,有連結串列和陣列兩種,用陣列存訪問速度快,但插入、刪除節點操作就比較費時了。實際中更多的是用鏈來表示二叉樹的。

 

4   遍歷方法

分為前序遍歷,中序遍歷和後序遍歷,和按層次遍歷。

前三種方法,根據根結點的順序命名的,中序遍歷最重要。可用遞迴實現,或者模擬棧操作來實現非遞迴的遍歷方法。

中序遍歷如下圖:

 

按層遍歷也比較簡單,就是自己實現一個佇列就可以了,也可以用陣列來模擬。需要注意的是後序遍歷的非遞迴演算法,需要一個標識來標識某個節點的狀態,具體的就是當一個節點左孩子被遍歷的時候為一個狀態,當左右兩個節點都被遍歷的時候又是一個狀態,只有一個節點的左右孩子幾點都被遍歷,才可以輸出這個節點的值,這個和後序遍歷的定義差不多。

 
 

 

參考連結:https://www.cnblogs.com/idorax/p/6441043.html#top

二叉樹實現參考連結:https://segmentfault.com/a/1190000014743964

相關文章