我有树结构:
public class Tree{
int topSize = 10 ;
Tree[] children2 = new Tree[topSize];
Tree parent;
String data;
int i = 0;
public void addChild(Tree child) {
child.setParent(this);
this.children2[i++] = child;
}
}
我在我的程序中使用它,例如:
example 1: example 2:
F H
/ / \
E I J
/ /
D T
/
C
我希望功能能给我一个结果:WB
示例1:函数应返回一个数组:C(树节点)
例2:函数return me result in array [0] = T(树节点有数据T),array [1] = J(树节点)。
我需要将示例1和示例2中的发束展平为:
example 1 example 2
solution solution
F H
/ | \ / | \
E D C I J T
我有以下函数接受leaf作为参数:
public static Tree find(Tree edge){
if(edge != edge.parent){
edge.parent = find(edge.parent);
edge.parent.addChild(edge);
}
return edge.parent;
}
所以在例如1中我使用:find(C)
例如2我认为我应该使用:find(T)然后find(edge J)。
在main中,我给出了包含以下内容的数组:
treeArray[0]
data="d", children[] - children[3]->data="c",children[0]->data="a", children[0]=null
/ \
children[0]->data="b",children[0]=null children[1]->data="b",children[0]=null
我有同样的孩子但我删除它所以我想
答案 0 :(得分:1)
我认为您正在采用以下方法:
public static void findLeaves(Tree root, List<Tree> leaves){
//iterate over children
for(Tree child : root.children2) { //better use getter
//if child has no children it is a leaf. Add it to list
if(! hasChildren(child)) leaves.add(child);
//if child has children, check them
else findLeaves(child, leaves);
}
return ;
}
static boolean hasChildren(Tree child) {
for(int i=0; i < child.children2.length; i++) {
if(child.children2[i] != null) return true;
}
return false;
}
该方法应将所有叶子(没有子节点的节点)添加到List<Tree> leaves
(如果需要,可以将其转换为数组)。
使用它:
List<Tree> leaves = new ArrayList<>();//a list to hold leaves after method runs
findLeaves(root, leaves);
请注意:
我无法跑步并检查方法。请仔细检查
2.该方法不是安全的。 root
和leaves
都不应为空