我在java中为“第一个孩子的下一个兄弟”树实现了一个类。
这是表示这样一棵树的链接
http://www.cs.utexas.edu/~novak/cs315116.html
我已经实现了以下功能:
addChild();
getLabel();
setLabel(T v);
getParent();
getNextSibling();
getFirstChild();
我的addChild函数按以下顺序添加子项。
public void addChild(Tree<T> c) {
c.parent = this;
if (firstChild == null)
firstChild = c;
else {
c.nextSibling = firstChild;
firstChild = c;
}
}
That is, if we have a tree node 1 and we add tree node 2 and then tree node 3 to it then the final tree would be,
1.addChild(2);
1.addChild(3);
1 1
/ \ which is internally stored as /
3 2 3 - 2
The most recent child added would be the first child
我想实现一个CopyTree函数,当给出任何这样的树作为参数时,它将创建树的副本并返回它。 我有一些初始代码,但我无法得到正确的递归。
private Tree<String> CopyTree(Tree<String> tr){
if (tr == null)
return null;
Tree<String> t = new Tree<String>();
t.setLabel(tr.getLabel());
if (tr.getFirstChild() != null) {
t.addChild(CopyTree(tr.getFirstChild()));
}
Tree<String> temp = tr.left();
if (temp != null) {
while (temp.getNextSibling() != null) {
t.addChild(CopyTree(temp.getNextSibling()));
temp = temp.getNextSibling();
}
}
return t;
}
如何使递归工作?
提前致谢
答案 0 :(得分:0)
首先,我相信你在这里有错误:
while (temp.getNextSibling() != null) {
t.addChild(CopyTree(temp.getNextSibling()));
temp = temp.getNextSibling();
}
由于getNextSibling()返回右侧的下一个子节点,但addChild()从左侧插入子节点,因此您在此处撤消顺序。这可能没问题,但要尽量避免这种情况。
要回答您的问题,您的递归函数应该作为新树的每个节点上的方法调用,并接收旧树的相应节点作为参数。然后,它应该从新树中的旧树复制此节点的子节点,并在执行此操作时,在每个子节点上调用递归函数。
答案 1 :(得分:0)
得到了..
private Tree<String> CopyTree(Tree<String> tr){
if (tr == null)
return null;
Tree<String> t = new Tree<String>();
t.setLabel(tr.getLabel());
Tree<String> temp = tr.left();
if (temp != null) {
ArrayList<Tree<String>> list = new ArrayList<>();
while (temp.getNextSibling() != null) {
list.add(temp.getNextSibling());
//t.addChild(CopyTree(temp.getNextSibling()));
temp = temp.getNextSibling();
}
for (int i = (list.size()-1); i>=0; i--) {
t.addChild(CopyTree(list.get(i)));
}
}
if (tr.left() != null) {
t.addChild(CopyTree(tr.left()));
}
return t;
}