[英]What should a Tree class contain?
我的 class 目前正在做二叉樹作為我們數據結構單元的一部分。 我知道節點 class 在其構造函數中必須有 3 個參數(值、左節點、右節點)。 作為需求的一部分,我們必須有一個樹 class。樹 class 的目的是什么? 是為了管理整套節點嗎? 它是否只包含插入、刪除和搜索特定節點所需的功能?
先感謝您。
我的節點 class:
class Node {
protected int data;
protected leftNode;
protected rightNode;
Node (int data, Node leftNode, Node rightNode){
this.data = data;
this.leftNode = leftNode;
this.rightNode = rightNode;
}
}
是的,它應該通過封裝與內部結構相關的所有行為和算法來提供Tree的功能接口。
為什么這很好? 因為你將定義一些只提供一些功能並且以獨立方式工作的東西,這樣每個人都應該能夠使用你的樹 class 而無需關心節點、算法等。
理想情況下, class 應該是參數化的,這樣您就可以擁有Tree<T>
並且您將能夠擁有通用方法,例如
T getRoot()
基本上你必須投影它,這樣它就可以讓你
任何數據結構的目的都是為您提供一種方法來保存 collections 個相關值並以有意義的方式操縱它們。
樹是一種特殊的數據結構。 對於分層數據是一個不錯的選擇:那些具有自然父子關系的數據。 二叉樹的每個父節點最多有兩個子節點。
樹的另一個值得特別提及的特征是它是自相似的:樹中的每個節點本身就是子樹的根。 遞歸利用了這個事實。
是的,這些都是很好的開始方法。 您可能想查看java.util.Map
界面,了解其他可能有用的信息。
正如我所看到的, Tree
class 應該包含對樹的根節點以及對整個樹進行操作的方法和屬性的引用,而不是屬於每個節點的方法,如getLeft()
、 getValue()
。
例如,我將在Tree
class 中定義一個size
屬性,向樹添加或刪除節點的方法(也恰好在此類中)將負責保持大小最新。
“是為了管理整套節點嗎?”
是的。
“它是否只包含插入、刪除和搜索特定節點所需的功能?”
基本上,是的。 出於這個原因,它應該至少包含對根節點的引用。
正如您所懷疑的那樣,該假設存在一些缺陷。 您定義的Node
類型是二叉樹的完美實例。
Jack 提到您希望在整個節點集周圍有一個Tree
類型,以便提供getRoot
、插入、刪除等操作。 這當然不是一個壞主意,但這絕不是必需的。 go 中的許多操作都可以在Node
本身上進行,並且您不必擁有所有這些操作; 例如,支持和反對getRoot
操作的人數分別為 arguments。 反對它的一個論點是,如果你有一個算法,在某一點只需要一個子樹,那么持有根Node
的Tree
object 會阻止你的算法不再需要的Node
的垃圾收集。
但更一般地說,這里需要問的真正問題是:您正在處理的哪些事情是接口,哪些是實現? 因為如果您想將二叉樹作為接口公開給調用者是一回事,如果您想提供某種有限的 map 作為接口又是另一回事,而二叉樹只是一個實現細節。 在前一種情況下,客戶端將“知道”樹是null
或具有值和分支的Node
,並且將被允許,例如,遞歸樹的結構; 在后一種情況下,客戶端將“知道”的只是您的 class 支持某種形式的put
、 get
和delete
操作,但不允許依賴於將其存儲為搜索樹這一事實。 在后一種情況的許多變體中,您確實會使用Tree
類型作為前端來向客戶端隱藏節點。 (例如,Java 內置的java.util.TreeMap
class 就是這樣做的。)
所以最短的答案是,真的,這取決於。 稍微長一點的答案是它取決於二叉樹實現和它的用戶之間的契約是什么; 調用者允許對樹進行哪些假設,二叉樹的哪些細節是作者希望將來能夠更改的東西,等等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.