【发布时间】:2021-11-24 01:28:37
【问题描述】:
我正在做这个 Leetcode 问题,它要求展平一棵树(请参阅:https://leetcode.com/problems/flatten-binary-tree-to-linked-list),这是我拥有的代码,但我很困惑为什么输出似乎返回相同的原始树。我不是直接修改树本身来返回吗?我似乎缺少什么?
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()) {
while (curr != null) {
stk.push(curr);
if (trk == null) {
trk = root;
} else {
trk.left = null;
trk.right = curr;
trk = trk.right;
}
curr = curr.left;
}
curr = stk.pop();
curr = curr.right;
}
}
}
【问题讨论】:
-
我建议使用递归,而不是堆栈。当你在做完左孩子后回到一个节点时,你怎么知道去右孩子,而不是向上?
-
如果你使用递归来做一个 DFS 收集预购的节点,那么你可以迭代得到的预购并将节点作为正确的孩子相互附加
-
@rkechols 好吧,我总是向右走,直到 right 为空,否则我会弹出。这不就是前置遍历的前提吗?访问中间节点,然后左,右。
-
@rkechols 是的,我明白了,但我仍然不明白为什么我的解决方案无效。我最终在做同样的事情(递归调用最终仍然会为每个调用占用内存空间,因此它与拥有物理堆栈数据结构没有太大区别)并且正在修改结构。我只是对出错的地方感到困惑,因为我习惯了返回物理值的函数。在这种情况下,返回类型为 void,因此它只是希望您展平/修改现有树。
-
我还没有将它带到调试器中,但我敢打赌,问题是你在遍历树时会刺激它。不好
标签: java data-structures tree binary-tree