[英]Tree Implementation in Java
我得到以下樹:
然后,我們被告知要使用last-child / previous-sibling方法更改這三個方法的實現。 結果是:
我現在正在研究Java實現,以在此樹上執行不同的功能。 我們有一個Tree接口和一個TreeNode接口。 它們都有許多我們要填寫的功能。
節點是這樣創建的:
MyTreeNode a = new MyTreeNode ("a");
通過以下方式創建樹(具有根):
MyTree tree = new MyTree (a);
最后,節點被賦予兄弟姐妹,例如:
e.setChild(j);
e.setSibling(d);
我已經為setChild,setSibling,getNextSibling,getFirstChild和getChildren編寫了方法。 例如,這是getChildren的代碼:
public List getChildren ()
{
List <MyTreeNode> children = new ArrayList <MyTreeNode> ();
MyTreeNode x = this.child;
children.add(x);
while (x != null && x.sibling != null) {
x = x.sibling;
children.add(x);
}
return children;
}
現在我完全迷失了如何編寫高度,深度,節點子樹大小,getPreOrder,getPostOrder和樹大小的方法。
由於樹現在處於這種不同的表示形式中,因此我不確定如何編寫遞歸方法來檢查節點的高度或深度。 通常,據我了解,您將遞歸檢查左/右子樹..但是現在沒有了(據我所知)。 我能想到的唯一方法就是在每個節點上循環許多if語句和while循環..但這並不是最好的方法。
如何通過樹的實現遞歸地編寫這些方法?
另外,由於節點不以任何方式存儲在一起,因此我不確定如何獲取有關整個樹的詳細信息。 它們是按照我上面顯示的方式實現的,所以我不確定如何集體收集所有節點的數據。
如何在整個樹上的所有節點上創建樹大小,isEmpty或makeEmpty之類的方法?
抱歉,說明太冗長。
假設您的樹具有這樣的節點結構:
public class Node{
String nodeName;
Node left;
Node right;
public Node(String nodeName, Node left, Node right){
this.nodeName = nodeName;
this.left = left;
this.right= right;
}
}
這是我對如何構造新樹的想法:在向樹中添加新節點時,您仍將保持樹結構。 根據將節點添加到樹的方式,您仍將繼續在父節點的左側或右側添加節點。
可視化新樹的一種可能方法是:
A
/
E
/ \
D J
/ \ / \
C H I K
/
B
/
G
/
F
注意:我在這里假設如果是一個孩子,它將被添加到您父母的左側。 但這在理想情況下取決於您的要求
如果您可以通過這種方式可視化此樹,則用於獲取高度,前序和后序遍歷的遞歸函數仍然保持不變。
還有兩個提示:
添加同級就像在節點的父級的左側或右側添加一個節點,即,如果當前節點在其父級的左側,則可以在右側添加新節點。
添加一個孩子將保持不變。 根據您的邏輯,您可以將新節點添加為當前節點的左子節點或右子節點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.