2010-09-10 209 views
1

我想爲C++ Linux項目實現一個通用的分層樹。在C++中實現一棵樹

雖然我還沒有找到任何標準庫樹形容器。

是否存在?

由於提前, 添

+3

樹可以是地圖等東西中使用的基礎數據結構 - 您是否爲特定目的實現樹? – 2010-09-10 16:56:24

+0

[爲什麼C++ STL不提供任何「樹」容器?](http://stackoverflow.com/questions/205945/why-does-the-c-stl-not-provide-any-tree-容器) – 2010-09-10 18:23:06

回答

3

的STL集合和地圖都使用二叉樹內部

2

STD:地圖<>用一棵樹來實現,你可以利用這一點。這是目前我能想到的唯一的「標準庫樹形容器」。

1

默認情況下沒有STL類。你可以使用STL組件編寫自己的樹類,或者你可以給這個STL-像樹LIB一試:

http://tree.phi-sci.com/

5

下面是一個創建分層樹(n進制沒有特殊屬性),使用STL容器的簡單方法。它不是預先構建的,但它很簡單,並且利用了一些STL屬性。要創建自己的搜索,你必須實現自己的算法,但這應該是相當輕鬆的。

template<typename T> 
class TreeNode 
{ 
public: 
    TreeNode() 
    { 
    } 

    TreeNode(const T& value) 
     : Value(value) 
    { 
    } 

    T Value; 
    std::list<TreeNode<T> > Children; 
}; 
+0

+1但是,我的問題的答案(http://stackoverflow.com/questions/6517231/are-c-recursive-type-definitions-possible-in-particular-can-i-put-a-vectort)表示這不是合法的C++。如果你可以在那裏發表一個令人信服的答案,我肯定會讚揚它並接受它。 – 2011-07-01 04:46:26

+0

@ Bill:真的嗎?臭死了。我相信在這種情況下,它可以通過[pimpl](http://en.wikipedia.org/wiki/Opaque_pointer)來緩解,但這會使它變得更加骯髒,並且不必要地變得更慢。我想你總是可以使用鏈表。或者'std :: list *>''怎麼樣?這聽起來幾乎合法。同樣,不必要的混亂,但。 – 2011-07-01 04:50:52

+0

該死的我真的希望你會說這是完全合法的。它確實*工作*,作爲一個實用主義者,對我來說意義重大。你說得對,ptr版本是合法的,但它會讓我煩惱多少額外的複雜性。 – 2011-07-01 06:37:22

0

沒有可用於構建樹結構的標準庫容器。但是,如果你在理論上足夠了解並且對編程語言(在你的情況下是C++)沒問題,那麼創建一個通用樹並不是一件困難的任務。

從創建通用(模板化)節點開始,爲子項(二叉樹)添加兩個指針或爲子項(n元組)添加指針列表。

struct Node 
{ 
    int data; 
    Node *left; 
    Node *right; 
} 

你走了。創建一個實例並擁有根節點。創建更多節點並將它們作爲子節點附加到根節點。重複相同的操作。玩樹很棒!

你會在網上找到很多例子。有一個here 完全支持Niki的答案。