检测树中的节点是否已访问子节点或子节点

时间:2013-04-19 21:51:54

标签: java

我正在努力解决检测树中节点存在或已被访问过的逻辑问题。

我有一个带节点的树(一个节点有一个左右子节点)。

我想检查节点上的两件事: 如果没有子节点 如果有子节点,我想检查它们是否已被访问过。

我目前有一个很讨厌的情况。有没有办法可以简化它?

public boolean finished(){
      return right == null && left == null || ((right != null && right.visited && (left != null && left.visited))
}

我希望finished()成为现实: 如果左右节点不存在 如果权利存在并且已被访问过 如果左边存在且已被访问

我想我还需要一个OR,所以如果权利存在AND访问AND,则为空

我有点困惑:S

2 个答案:

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

理论上,您确实需要逻辑来扫描树中的所有节点,并在全局计数器换行时重置它们,但实际上通常不需要它们。