我的任务是从字符串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。
有人可以就如何改善这个提出建议吗?
答案 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;
}