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

LeetCode「Flatten Binary Tree to Linked List」问题:代码逻辑验证看似正确但提交不通过,求解决方案

LeetCode「Flatten Binary Tree to Linked List」问题:代码逻辑验证看似正确但提交不通过,求解决方案

兄弟,我一眼就瞅出你代码里的两个核心问题,这就是LeetCode判错的根源:

1. 违反了题目「原地修改」的硬性要求

题目明确要求是直接修改原二叉树的结构,将其扁平化为链表,绝对不能新建TreeNode对象!你的代码里通过new TreeNode(node.val)重新生成了一整套节点,相当于造了个全新的链表,但原输入的root树结构完全没被改动——LeetCode的评测系统是盯着你传入的原root节点看的,自然会判定错误。

2. Java参数传递的坑:形参赋值不会影响外部实参

你在flatten方法里写了root = res;,但Java是值传递,这里的root只是方法的局部形参,你给它赋值根本不会改变外部原本传入的root引用。打个比方:你手里攥着一个杯子(原root),方法里给你递了个新杯子(res),你把手里的杯子换成新的,但原来的杯子还是原样,评测系统看的就是原来那个杯子的状态。

修正思路&代码示例

我们需要直接在原树上调整指针,用先序遍历的逻辑,把左子树移到右子树的位置,再把原来的右子树接在左子树的最右侧节点后面。这里给你一个递归的正确实现:

class Solution {
    public void flatten(TreeNode root) {
        // 递归终止条件:空节点直接返回
        if (root == null) return;
        
        // 先递归处理左右子树
        flatten(root.left);
        flatten(root.right);
        
        // 保存原来的右子树,避免被覆盖
        TreeNode tempRight = root.right;
        // 把左子树移到右子树的位置
        root.right = root.left;
        root.left = null; // 左指针必须置空,符合链表结构要求
        
        // 找到当前右子树(原左子树)的最右侧节点
        TreeNode current = root;
        while (current.right != null) {
            current = current.right;
        }
        // 把原来的右子树接在最右侧节点后面
        current.right = tempRight;
    }
}

为什么你调试时看起来正确?

你调试时看到的res是你新建的链表,结构确实符合要求,但LeetCode评测的是你传入的原root节点的结构,你完全没修改它,所以系统会提示root没有变化。

备注:内容来源于stack exchange,提问作者hermit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 12:18:02