Java:我的常规树遍历实现有什么不正确?

时间:2015-10-01 02:35:28

标签: java tree

我的任务是从字符串targetName给出的常规树中查找并返回特定节点。看看下面我的实现:

public GeneralTreeNode findNode(String targetName) {          
    if (this.name.equals(targetName)) {
        return this;
    } else {
        for (GeneralTreeNode child : this.children) {
            return child.findNode(targetName);
        }
    }
    // no node containing the string could be found
    return null;  
  }

唯一的问题是,实际上节点确实存在时,这常常会错误地返回null。好像最后一行return null太贪婪了。

在这上面查看几个断点并观察它只显示它似乎只有最低深度,直到一个节点没有子节点,在这种情况下它只返回null。

有人可以就如何改善这个提出建议吗?

2 个答案:

答案 0 :(得分:2)

将您的代码更改为:

public GeneralTreeNode findNode(String targetName) {          
    if (this.name.equals(targetName)) {
        return this;
    } else {
        for (GeneralTreeNode child : this.children) {
            GeneralTreeNode childResult = child.findNode(targetName);

            if (childResult != null) {
                return childResult;       // only return if you really found something
            }
        }
    }

    // no node containing the string could be found
    return null;  
}

如果确实找到了某些内容,您只想从子搜索中返回结果。

答案 1 :(得分:0)

如果以这种方式实现,代码的可读性就会消失。在助手类中更好地实现了树遍历,并且将带有target_name的ROOT元素一起传递。

如果以这种方式返回null,则类似于节点为null实际上它不是。另一方面,当你使用" doer"或"处理器"方法/功能,它可以返回真实的说法"我找不到任何东西"。

仍然,你的代码似乎没问题。我只是重写它。

static Node search(Node node, String nodeName) {
   if (node.getName().equals(nodeName)) return node;

   List<Node> children = node.getChildren();
   foreach(Node child : children) { 
      Node resultChild = search(child, nodeName);
      if (resutlChild != null) return resultChild;

   }

   return null;

}