簡體   English   中英

樹抽象數據類型

[英]Tree Abstract Data Type

我正在做一個叫做數據結構和算法的單元。 我們才剛剛開始,我的教授剛剛教了我們代數語義學和公理是什么的基礎。到目前為止,我只是以數組的形式使用樹。 不將預簽名樹的簽名用作樹(值,樹,樹),其中value是節點中的值,左節點是第一棵樹,右節點是第二棵樹。

現在,我將樹定義為tree(值,樹,樹)或Nil,我不知道如何定義addNode(值,樹)的代數。

每個級別都變得越來越復雜,而且,我想不起來想一次掃描一個級別,因為從現在開始大約一個小時就一直在嘗試。 當我們從樹上下來時,代數只是分支成越來越多的if-eles。 我做對了嗎? 你能為我指出正確的方向嗎? 還是不能將樹實現為樹(值,樹,樹)?

這是我的教程的一部分(在其他問題中不值任何分數),但是我不是在尋找即時答案,我喜歡這個主題,並且想了解更多。

編輯1:我簽出了Wikipedia,但我不想使用教科書給出明確的答案,我只是想向正確的方向提供提示,無論我的方法是正確的還是將樹定義為完全不可行樹(值,樹,樹)。 我知道您可以以列表形式表示樹型ADT。 但我想真正考慮一下。 希望有道理。 非常感謝你們!

編輯2:嗯,很難在互聯網上解釋。 假設我正在定義一個名為“ tree”的新數據結構。 我可以用自己想要的任何方式定義它,並且它的行為必須像平衡的二叉樹(盡管父母和孩子的值無關緊要),所以我將其定義為tree:tree(value,tree,tree)OR nil這不是編程代碼,這就是我的定義方式。 Tree是一個值+ 2個其他樹,或者Tree是nil。 現在,addNode(value,tree)將一個節點添加到樹中,同時保持其平衡。 這不是編程代碼,而只是代數語義。 我不知道我能否正確解釋。 但是我找到了一個可以使用隊列或堆棧實現的解決方案,但這是我必須定義的另一個ADT,這是無效的。

編輯3:好像我已經做了很多事情,使問題變得比原本想的要難。 首先,根據我給的小解釋,Gamecat的答案是完美的。 但是我同意這些意見,包括其他ADT是完全正確的。 實際上,當我們構建使用Int的任何東西時,我們都在對該結構使用ADT。 我認為每個ADT都必須是唯一的。 無論如何,非常感謝你們的回答!

如果要將節點添加到樹,則可以使用遞歸函數。

我認為樹是有序的。 所以你應該得到這樣的東西:

AddNode(value, tree)

if tree is empty, create a new tree with value as node and no subtrees.
if value lesser than the treenode, call AddNode on the left branch.
else call AddNode on the right branch. (if duplicates are allowed).

如果更改了子樹,請確保對其進行更新!

您可以通過以下方法將其轉換為非遞歸函數:

if tree is empty, return a new tree with value as node and no subtrees.
if value is lesser than treenode, and there is no left subtree, create a new left subtree with value as node and no subtrees.
if value is lesser that treenode, and there is a left subtree, try again with the left subtree.
if value is greater or equal than treenode, and there is no right subtree, create a new right subtree with value as node and no subtrees.
if value is greater or equal than treenode, and there is a right subtree, try again with the right subtree.

如果樹需要平衡。 您需要存儲以獲得平衡重(可以是-1、0或1)。 如果您需要在“繁重”的站點上添加節點,則需要重新組合。 例如,如果左側比右側多一個節點,而您需要在左側再增加一個節點。 您需要從左側子樹中獲取具有最高值的節點,並將其提升到當前頂部。 前一個頂部已添加到右側子樹中。 確保子樹也保持平衡。

示例:添加節點0、1、2、3、4

Add(0)           0

Add(1)           0
                  \
                   1

Add(2)           0 (2)  =>      1 (2) =>  1
                  \            /         / \
                   1          0         0   2

Add(3)           1
                / \
               0   2
                    \ 
                     3

Add(4)           1 (4)     => 2 (4)  =>      2
                / \          / \            / \
               0   2        1   3          1   3
                    \      /              /     \
                     3    0              0       4

這是一個很難的問題,因為它很模糊。 我假設您有一本教科書或類似的東西作為您課程材料的一部分。 即使這樣,感覺您遇到的許多問題似乎都是由基本資源來解釋的,例如二進制樹上的Wikipedia條目

本頁描述如何進行各種樹遍歷以及如何表示樹。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM