我正在努力解决检测树中节点存在或已被访问过的逻辑问题。
我有一个带节点的树(一个节点有一个左右子节点)。
我想检查节点上的两件事: 如果没有子节点 如果有子节点,我想检查它们是否已被访问过。
我目前有一个很讨厌的情况。有没有办法可以简化它?
public boolean finished(){
return right == null && left == null || ((right != null && right.visited && (left != null && left.visited))
}
我希望finished()
成为现实:
如果左右节点不存在
如果权利存在并且已被访问过
如果左边存在且已被访问
我想我还需要一个OR
,所以如果权利存在AND
访问AND
,则为空
我有点困惑:S
答案 0 :(得分:0)
我认为这可能就是你的目标
if( (right == null || right.visited) && ( left == null || left.visited) )
因此,对于每个子节点,如果它是空的或已被访问过,那么您就完成了。
这涵盖案例
Right == null; Left == null;
Right == null; Left.visited;
Right.visited; Left == null;
Right.visited; Left.visited;
我认为给出描述的是您想要检查的案例。
答案 1 :(得分:0)
“访问”的最简单方法是在节点中放置“已访问”标志。重置所有要启动的标志,然后进行树遍历并在访问时设置标志。
为避免每次使用后都必须重置“已访问”标志,请将“标志”设为整数,并保留一个全局计数器,每次进行需要访问标记的扫描时,该计数器会递增:
boolean haveVisited() {
return visitedFlag == globalVisitedCounter;
}
void markVisited() {
visitedFlag = globalVisitedCounter;
}
理论上,您确实需要逻辑来扫描树中的所有节点,并在全局计数器换行时重置它们,但实际上通常不需要它们。