我得到了以下树:
然后我们被告知使用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等方法作为整个树?
对于过于冗长的解释感到抱歉。
答案 0 :(得分:2)
假设您的树有这样的节点结构:
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
注意:我在这里假设,如果它是一个孩子,它将被添加到你父母的左边。但理想情况下,这取决于您的要求
如果您可以通过这种方式显示此树,则用于获取高度,预订,后序遍历的递归函数仍然保持不变。
还有几点提示:
添加兄弟就像在节点的父节点的左侧或右侧添加一个节点,即如果当前节点位于其父节点的左侧,则应在右侧添加新节点。 / p>
添加孩子将保持不变。根据您的逻辑,您可以将新节点添加为当前节点的左子节点或右子节点。