概念
A tree is a nonlinear data structure, compared to arrays, linked lists, stacks and queues which are linear data structures. A tree can be empty with no nodes or a tree is a structure consisting of one node called the root and zero or one or more subtrees.
樹是一個非線性的數據結構,相比較而言,數組,鏈表,棧和隊列等等就是線性的數據結構。樹可以爲空,不包含任何節點,或者樹可以稱爲由一個根節點和零個或者多個子樹構成的。
判斷是否是一顆樹的條件:
- 有且只有一個根節點;
- 有若干個互不相交的子樹;
- 根節點(root)沒有父節點;
- 一個節點有且只有一個父節點(根節點除外);
- 節點可以有多個子節點;
和樹相關的一些術語,查閱了網上的一些資料,做了一下整理;
Terminology(術語) | Explaining(解釋) |
---|---|
Root(根) | 樹中的頂級節點 |
Child(子節點) | Root的每一個子樹的根叫做Root的子節點(Child) |
Parent(父節點) | Root是每一個子樹的根的父節點(Parent) |
Siblings(兄弟節點) | 一些具有相同父節點的節點稱爲兄弟節點 |
Descendant(後代) | 對任意節點x,從根節點到節點x的所有節點都是x的祖先 |
Ancestor(祖先) | 對任意節點x,從節點x到葉子節點的所有節點都是x的後代 |
Leaf(葉子節點) | 沒有子節點的節點 |
Degree(度) | 子節點的個數(最大子節點的度稱爲樹的度) |
Edge(邊) | 父節點和子節點相連的一個路徑 |
Depth(深度) | 節點的深度定義爲:當前節點和根之間的邊數。 |
Height of node(節點的高) | 節點的高度是該節點與後代節點之間最長路徑上的邊數,所以葉子節點高度爲0 |
Height of tree(樹的高) | 樹的高度是其根節點的高度 |
Forest (森林) | 多顆互不相交的樹組成的集合 |
樹的分類
按照個人的理解進行分類;
- 一般樹:任意一個節點的子節點的個數都不受限制;
- 二叉樹:任意一個節點的子節點的個數最多隻有兩個;
- 一般二叉樹
- 滿二叉樹:在不增加樹的層數的前提下,無法再多添加一個節點的二叉樹
- 完全二叉樹:如果只是刪除了滿二叉樹的最底層最右邊的連續若干個節點,則這樣形成的二叉樹叫完全二叉樹;
- 森林:n個互不相交的樹的集合;
樹的數據結構
typedef struct TreeNode *PtreNode; //前向聲明
struct TreeNode {
ElementType element;
PtreNode FirstChild;
PtreNode NextSibling;
}
總結
大部分的知識點主要參考了wiki上的解釋,這裏對於二叉樹的分類都是點到即止,其實需要自己結合實踐寫代碼實現一下,深入瞭解知識點和應用場景,以加深理解,如有錯誤的地方,希望指正。