概念:
節點:樹的元素
根節點:沒有父節點
內部節點:除根節點外的節點
葉節點:沒有用子節點
深度depth:節點到根節點所經過的邊的數目
根節點的深度 0,屬於第0層
節點的度degree:節點所擁有的的子節點數(直接子節點)
葉節點的度為0.
樹的高度:所有節點深度的最大值叫做樹的高度。
子樹:節點及該節點所有的後代和邊組成子樹
子樹的高度
樹中節點的各子樹從左至右是有序的,則成為有序樹,否則為無序樹。
介面與實現
父節點表示法或雙親表示法
c++實現
tree_parent.**件
#ifndef _tree_parent
#define _tree_parent
#include
#include
// 樹的節點
template
<
class
type
>
class
tree_parent_node
;// 樹結構,用vector儲存單個節點
template
<
class
type
>
class
tree_parent
;// 過載運算子
template
<
class
type
>
tree_parent_node
&tree_parent
::operator
(int i)
// 過載《運算子
template
<
class
type1
>
std::ostream &
operator
<<
(std::ostream &out, tree_parent
&t)return out;
}#endif
這樣站到某個節點的父節點很容易, 時間複雜度o(1)。但是孩子節點需要遍歷整個樹。
這個時候,我們可以在每個節點中增加乙個第乙個孩子節點,這樣就可以快速找到節點的孩子。
template
<
class
type
>
class
tree_parent_node
;
但是乙個節點有多個孩子的問題,並沒有解決,還是需要遍歷樹,可以繼續增加孩子節點來表示第二個、第三個孩子,但是這樣會存在空間浪費的問題。
類似的,兄弟節點之間的關係,可以增加乙個右兄弟節點,來表示某個節點的有兄弟
template
<
class
type
>
class
tree_parent_node
;
這上面的三種方式時可以靈活組合的。
孩子表示法
把每個節點的孩子節點用單鏈表的儲存,n個節點就有n個孩子鍊錶,n個頭指標用順序儲存結構,放在陣列中.
// 某個節點的孩子節點的位置組成的鍊錶
class
tree_child_nodechild
;// 樹的節點
template
<
class
type
>
class
tree_child_node
;// 樹, 用vector儲存
template
<
class
type
>
class
tree_child
;
樹的節點裡面還可以增加表示父節點的位置,方便找到父節點
// 樹的節點
template
<
class
type
>
class
tree_child_node
;
上面兩種方式都是將節點儲存在了陣列之中,這樣的好處,可以快速根據位置找到節點。
每個節點中包括資料域、父節點在陣列中的位置或孩子節點在陣列中的位置或者兄弟節點在陣列中的位置,或者資料域中包含了該節點的孩子節點組成的鍊錶。
孩子兄弟表示法
節點包含資料域,第乙個孩子節點的指標,右兄弟節點的指標。然後有個頭指標指向根節點。
節點表示:
template
<
class
datatype
>
class
csnode
;
然後樹的定義:
template
<
class
datatype
>
class
tree
;
這種表示可以很方便的找到某個節點的孩子節點,先找到第乙個孩子節點,然後第乙個孩子節點的有兄弟節點,一次類推往後找孩子節點。另外還可以在節點中增加乙個parent指標表示父節點
template
<
class
datatype
>
class
csnode
;
這種方式根據位置找對應節點時,需要進行遍歷的。但是這種的好處是可以將樹轉化成二叉樹。這樣可以利用很多二叉樹的性質。
孩子兄弟表示法應該是比較常用的表示樹結構的方式
資料結構 樹
樹的概念 1.家族樹 在現實生活中,有入如下血統關係的家族可用樹形圖表示 張源有三個孩子張明 張亮和張麗 張明有兩個孩子張林和張維 張亮有三個孩子張平 張華和張群 張平有兩個孩子張晶和張磊。以上表示很像一棵倒畫的樹。其中 樹根 是張源,樹的 分支點 是張明 張亮和張平,該家族的其餘成員均是 樹葉 而...
資料結構 樹
1 定義 樹是一種非線性結構,是一種一對多的資料結構。分析樹的結構,我們用遞迴的方法,根結點下面又可以看做是子樹。2 樹的儲存結構 我們一般用孩子兄弟法儲存。也就是把乙個結點的左邊第乙個孩子放在此結點的左邊孩子,把此結點的右兄弟放在此結點的右邊孩子。這樣就產生了二叉樹。二叉樹和樹可以相互對應。3 二...
資料結構 樹
二叉樹性質回顧 滿二叉樹 完全二叉樹等 給定一棵二叉樹,要求分層遍歷該二叉樹,即從上到下按層次訪問該樹,每一層單獨輸出一行,每一層要求訪問的順序為從左到右。我們在遍歷的過程中將該層節點的孩子節點壓入乙個佇列,這樣就可以實現從上到下一層一層地遍歷該二叉樹。層序遍歷 並分層列印 如果不用分層的話只用佇列...