【问题标题】:Binary Search Tree Inorder traversal cant understand solution二叉搜索树中序遍历看不懂的解决办法
【发布时间】:2020-11-16 13:54:33
【问题描述】:

您好,我目前正在关注 leetcode 面试问题,我有这个可行的解决方案,但我无法理解 2 件事

解决方案代码

public class Solution {
    public List < Integer > inorderTraversal(TreeNode root) {
        List < Integer > res = new ArrayList < > ();
        Stack < TreeNode > stack = new Stack < > ();
        TreeNode curr = root;
        while (curr != null || !stack.isEmpty()) {
            while (curr != null) {
                stack.push(curr);
                curr = curr.left;
            }
            curr = stack.pop();
            res.add(curr.val);
            curr = curr.right;
        }
        return res;
    }
}

我添加了一张图片来参考树中的值以进行解决 [1]:https://i.stack.imgur.com/CqN9Q.png

我不明白的是,直到 curr 不为空或堆栈为空之前的 while 循环,但是当我们向下遍历左侧时,我们到达结束然后中断内部循环,弹出堆栈 = curr,添加到列表然后等于curr 到 curr.right。

这是我不明白的?在附加的图像中,最左边的节点值为 4,它没有子节点,这意味着它的右子节点将等于 null,然后打破外部 while 循环结束解决方案?

第二个问题,时间复杂度在解决方案中是 O(n),但它不是 O(n) 的平方,因为我们在循环中有一个循环吗?

感谢所有帮助指出我不完全理解的内容

谢谢你:)

【问题讨论】:

  • 您的外部 while 循环有 2 个条件,如果其中任何一个为真,则将继续。正如您所指出的,curr 为空,因此,第一个条件为假,但是,如果堆栈上还有东西,那么第二个条件将为您提供真值,并且外部循环继续。

标签: java binary-tree inorder


【解决方案1】:

理解这一点的一个有用方法是通过空运行代码。对于您提供的示例,跟踪如下。

  1. 最初 curr = 1
  2. 我们进入外部while循环。除非 curr = null 且堆栈为空,否则我们不会退出它。
  3. 因为内部而我们到达了最左边的叶子节点。当前= 4
  4. 内部循环的下一次迭代导致 curr 为空,因此我们从中分离出来。此时从堆栈中弹出 4 并 插入到列表中。
  5. curr 转到 4 的右孩子,为空。
  6. 在外循环的下一次迭代中,curr 为空。然而,由于堆栈仍然不是空的,我们仍然再次进入外循环。 但是,由于 curr 为空,我们不会进入内部循环。
  7. 我们从堆栈中弹出一个元素。这次是 2。记住堆栈是 LIFO(后进先出)

至于整体时间复杂度。两个嵌套循环不一定转化为二次复杂度。总体复杂度仍然是 O(n),因为树中的每个节点最多被访问一次。

【讨论】:

  • 啊,好吧,如果 curr 为 null 或堆栈为空,我认为在 while 循环中使用 or 。但是你的意思是 curr 必须为 null 并且堆栈必须为空才能中断循环。解决方案不会使用 && 而不是 | 来编写吗? | ?
  • 我想你可以写while(!(curr==null &amp;&amp; stack.isEmpty())) {...},如果你更愿意考虑stop循环必须是真的什么。但是仅仅用&amp;&amp; 代替||(例如while (curr != null &amp;&amp; !stack.isEmpty()) {...})是绝对错误的
猜你喜欢
  • 2018-02-25
  • 1970-01-01
  • 1970-01-01
  • 2022-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多