【发布时间】: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