尝试编写一个布尔方法,告诉某人是否是某人的后裔......但似乎无法做到。当然,如果它是一个孩子......或者是孩子的后代,那么这个物体就是后代。
public boolean isDescendant(member x){
if (children.contains(x)){
return true;
}
else{
return false;
}
}
但我在哪里或如何插入:
for (int i = 0; i < children.size(); i++){
isDescendant(children.get(i));
}
谢谢!
答案 0 :(得分:5)
我认为你想要的是:
// Cleaned up version
public boolean isDescendant(member x){
// check for direct descendance
if (children.contains(x)){
return true;
}
// check for being descendant of the children
for (Child c: children){
if (children.get(i).isDescendant(x)) {
return true;
}
}
return false;
}
答案 1 :(得分:4)
行走的树木向下非常缓慢(从根部到树叶)。考虑这个is-ancestor检查的实现:
/**
* Checks whether the given node is an ancestor of this node.
*/
public boolean isDescendantOf(Node ancestor) {
Preconditions.checkNotNull(ancestor, "Ancestor");
if (equals(ancestor)) {
// every node is an ancestor to itself
return true;
} else if (parent == null) {
// not related
return false;
} else {
// recursive call
return parent.isDescendantOf(ancestor);
}
}
另一种方式现在是小菜一碟。
public boolean isDescendant(Node descendant) {
return descendant.isDescendantOf(this);
}
没有循环,没有指数的努力。
PS:
在我的示例中,我建议将isDescendant
重命名为isAncestorOf
。
答案 2 :(得分:-1)
public boolean isDescendant(member currentRoot, member x){
//check the current level
if (currentRoot.children().contains(x)){
return true;
}
//leaf
if( currentRoot.children().isEmpty() ){ return false; }
//try all my children
boolean found = false;
for( Member child : currentRoot.children() ){
found = isDescendant( child, x );
if( found ) break;
}
return found;
}
您最需要对当前根进行递归。
答案 3 :(得分:-1)
编辑:如果您的数据结构有父指针,请使用这些指针而不是在树中搜索您的后代。如果没有,请考虑添加它们。有关父指针的解决方案,请参阅whiskeysierra的答案。只有在无法添加它们时,请考虑这个答案。
目前的答案都有两个循环通过子项(一个在children.contains()
,一个在后面)。
这种变体可能更有效(但它不会改变O级),并且有点短。 (如果孩子是一个快速包含检查的集合(如HashSet),并且层次结构通常不那么深(所以你根本不需要递归),其他答案更好。)
public boolean isDescendant(Member x) {
for(Member child : children) {
if(child.equals(x) || child.isDescendant(x))
return true;
}
return false;
}
如果一个节点被认为是它自己的后代,你可以这样写:
public boolean isDescendant(Member x) {
if(equals(x))
return true;
for(Member child : children) {
if(child.isDescendant(x))
return true;
}
return false;
}