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
相关产品推荐
相关产品推荐

