LeetCode二叉树展开为链表代码运行返回原始树问题咨询
问题诊断与修正
核心逻辑疏漏点
- 最致命的疏漏:外层循环条件错误。初始状态下栈
stk为空,你写的while (!stk.isEmpty())会直接跳过所有执行逻辑,等于方法除了空判断外没有执行任何修改操作,这是运行后仍然是原始二叉树的核心原因。标准的二叉树栈遍历的循环条件需要同时判断栈非空或者当前节点非空,即while (!stk.isEmpty() || curr != null)。 - 次要疏漏:首节点处理逻辑存在隐患。当
trk == null时你直接赋值trk = root,但没有同步清空root的左指针,可能残留左子节点引用,不符合题目展开后所有节点左指针为null的要求。 - 优化点:节点处理时机耦合度高,你在节点入栈时就修改链表指针,逻辑拆分不清晰容易触发隐藏bug。
修正后的代码
class Solution { public void flatten(TreeNode root) { if (root == null) { return; } Stack<TreeNode> stk = new Stack<>(); TreeNode trk = null; TreeNode curr = root; // 修正循环条件,保证初始节点能进入遍历逻辑 while (!stk.isEmpty() || curr != null) { while (curr != null) { stk.push(curr); TreeNode nextLeft = curr.left; // 统一挂载逻辑,无需单独判断根节点 if (trk != null) { trk.left = null; trk.right = curr; } trk = curr; curr = nextLeft; } curr = stk.pop(); curr = curr.right; } } }
逻辑说明
调整后的代码按前序遍历顺序处理节点,每遍历到一个节点就将其挂载到上一个处理节点的右指针上,同时清空上一个节点的左指针,完全符合题目要求的原地展开规则。
内容的提问来源于stack exchange,提问作者Kawaki
相关产品推荐
相关产品推荐

