因為樹和森林都可以與二叉樹相互轉化,所以採用二叉鍊錶的儲存方式表示樹和森林容易在計算機中實現
共有10個節點,則有11個空指標
*fristchild指向該結點的第乙個孩子節點,*nextsibling指向該結點的兄弟節點。
雖然類似於二叉樹的左右孩子節點指標,但是功能不同
#
define
elemtype
char
typedef
struct
treenode
treenode;
typedef
struct
tree
tree;
void
inittree
(tree *tree,elemtype ref)
與二叉樹的建立相同,因為本身就是用二叉樹來儲存樹或森林
void
createtree
(tree *tree,
char
*str)
void
createtree
(tree *tree, treenode *
&t,char
*&str)
}
treenode*
root
(tree *tree)
treenode*
firstchild
(tree *tree)
treenode*
firstchild
(treenode *t)
treenode*
nextsibling
(tree *tree)
treenode*
nextsibling
(treenode *t)
treenode*
find
(tree *tree, elemtype key)
treenode*
find
(treenode *t, elemtype key)
a的右邊的a的兄弟節點,並不是a的右孩子,所以求b的父節點時,b的父節點時a節點的父節點
treenode*
parent
(tree *tree, treenode *p)
treenode*
parent
(treenode *t, treenode *p)
if(q!=
null
&& q==p)
return t;
return
null
;}
假設傳給函式的指標p是d,一開始 t 指向r,q 指向r的第乙個孩子(即a),q不為空且q!=d進入while迴圈,這時遞迴了,t是q(即a),q指向的a的第乙個孩子結點(d),這時q=p,直接返回t(即a),找到d的父節點就是a。
void
main()
樹和森林的孩子兄弟結構
linux核心中多處用到孩子兄弟結構來組織一些相同型別的資料。如task struct,dentry,vfs mount等,結構圖如下 實現原理很簡單,主要有三個字段 parent 指向父結構的指標 children 子結構鍊錶的頭 sibling 將自己連線到父節點的子結構鍊錶中。結構定義如下 t...
樹 孩子兄弟表示法的實現
樹狀圖是一種資料結構,它是由n n 1 個有限節點組成乙個具有層次關係的集合。把它叫做 樹 是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點 每個節點有零個或多個子節點 沒有父節點的節點稱為根節點 每乙個非根節點有且只有乙個父節點 除了根節點外,每個子節點可以分為多個不...
字典樹C語言實現
又稱單詞查詢樹,trie樹,是一種 樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的 字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比 雜湊樹高。include include de...