一.一般樹結點和樹的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的子...