【问题标题】:Confusion on Flattening a Tree扁平化树的困惑
【发布时间】: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


【解决方案1】:

好的,我发现了我的错误。在我如何遍历和更新导致树中形成循环的指针的一些问题中,最大和最明显的问题是我最初从未将任何东西推入堆栈,因此while (!stk.isEmpty()) 从未被调用,它只是几乎可以返回原始树。我傻了哈哈。

【讨论】:

    猜你喜欢
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多