布尔递归

时间:2011-02-16 16:19:15

标签: java recursion

尝试编写一个布尔方法,告诉某人是否是某人的后裔......但似乎无法做到。当然,如果它是一个孩子......或者是孩子的后代,那么这个物体就是后代。

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));
}

谢谢!

4 个答案:

答案 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;
}