C語言實現實現樹和森林(孩子兄弟表示法)

2021-10-08 17:36:20 字數 1708 閱讀 9682

因為樹和森林都可以與二叉樹相互轉化,所以採用二叉鍊錶的儲存方式表示樹和森林容易在計算機中實現

共有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...