一般樹性結構

2021-08-13 22:36:23 字數 1500 閱讀 2874

一.一般樹結點和樹的adt

template class gtnode

gtnode(e v, gtnode* lc = null, gtnode* rs = null)

e value()

gtnode* parent()

gtnode* leftmostchild()

gtnode* rightsibling()

bool isleaf()

void setvalue(e& v)

void insertfirst(gtnode*);

void insertnext(gtnode*);

void removefirst();

void removenext();

};

template class gentree 

void newroot(e&, gtnode*, gtnode*);

void print()

};

二.一般樹的遍歷

和二叉樹類似,但是除了中序遍歷對一般樹沒有太大的意義

樹的遍歷用的還是遞迴方法,和二叉樹類似

如:利用樹的遍歷進行列印

template void printhelp(gtnode* rt)
又:利用樹的遍歷,數出樹所有的結點

template void getcount(gtnode* rt) 

return count;

}

三. 父指標表示法

(1)父指標表示法:對每個結點只儲存乙個指標域指向父結點,特別適合解決判斷兩個結點是否在同乙個樹中的問題。

(2)父指標表示法常用的兩種操作:find和union

find:對給定的乙個結點,找到它的根節點

union:合併兩個集合

**實現:

template class gentree 

~gentree()

bool differ(int a, int b)

int find(int curr)const

void union(int a, int b)

};

(3)解決乙個問題:如何降低合併操作時樹的高度?

方法一:重量權衡合併規則:把結點少的樹和結點多的樹合併時,把結點少的樹的父指標指向結點多的樹

方法二:路徑壓縮:在find操作時,把當前結點所有的祖先結點的父結點都設定為根結點,這樣做能夠使得樹的高度最低,使得find操作的複雜度非常接近常數

四. 實現樹的方法:

(1)子結點表表示法:

(2)左子結點/右兄弟結點表示法:

(3)動態結點表示法:

(4)動態左子結點/右兄弟結點表示法:

五. 順序表示法:

儲存一系列結點的值,其中包含了盡可能少但是對於重建樹必不可少的資訊

一般性原則

1 遵循原來的編碼風格 當更改原來的 的時候,你的所有改變都應遵循原來的風格,不要引入乙個新的風格,不要試圖更改原來的 僅僅用來符合新的風格。在乙個檔案內擁有不同的 風格會使程式非常的難以閱讀和理解。從寫原來的 來改變它的風格有可能會引入一些可以避免的過失或錯誤。2 遵循最少意外原則 這個原則是建議...

錢包的一般性介紹

最近有很多朋友問我關於錢包的一些知識,為避免重複回答,下文做簡要一般性介紹,以後有人再問就直接給本文章的鏈結 顧名思義,錢包是用來儲存錢的。但在數字貨幣的世界中,錢包裡面並沒有 錢 錢包賬戶裡有多少 錢 都是記錄在區塊鏈上的,錢包裡只是儲存了賬戶對應的 私鑰,賬戶是從私鑰相應的公鑰衍生出來的。只要有...

GeneralTree 一般樹形結構類

這個類用於一般樹形,每個節點可以有多個分支,且數目不定。可以看做是二叉樹的變形形式。乙個節點除了父指標外還有左右兩個指標。左指標為孩子節點的起始指標,右指標為同父節點的兄弟節點的指標 例如 a的左指標為b,右指標為c,c的左指標為e,右指標為d 則,a,c,d為同兄弟節點。b為a的子節點,e為c的子...