You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用递归阻止树节点被移动到自身子、孙等后代节点下

问题根因
  • 递归调用返回值未捕获:你写的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 12:57:03