使用递归阻止树节点被移动到自身子、孙等后代节点下
问题根因
- 递归调用返回值未捕获:你写的
inSubtree方法中,递归调用自身的返回结果没有做判断和向上传递,只有直接子节点的拦截逻辑能生效,孙节点及更深层级的后代判断结果全部丢失,导致非法移动未被拦截,执行后出现分支消失的问题。 - 子树判断逻辑错位:当前
inSubtree的遍历逻辑完全不符合「判断目标节点是否是源节点后代」的需求,参数对应的判断逻辑写反,节点匹配判断的位置也错放在了子节点循环内。
修复后代码
private void movePosition(Position pos, Position target) { if (pos == null || target == null || pos == target) { return; } if (!inSubtree(pos, target)) { UI.println("safe to move "); pos.getManager().removeFromTeam(pos); target.addToTeam(pos); } else { UI.println("cannot move parent to children "); } } /** * 递归判断node是否是ancestor的后代节点 * @param ancestor 祖先节点(移动的源节点) * @param node 待检查节点(移动的目标节点) */ private boolean inSubtree(Position ancestor, Position node) { // 遍历祖先节点的所有直接子节点 for (Position child : ancestor.getTeam()) { // 直接子节点匹配,直接返回true if (child == node) { return true; } // 递归检查子节点的后代,匹配则向上返回true if (inSubtree(child, node)) { return true; } } // 所有后代均不匹配,返回false return false; }
内容的提问来源于stack exchange,提问作者Osca
相关产品推荐
相关产品推荐

