我正在Leetcode上针对此problem寻找第一个递归解决方案。这是建议的解决方案的代码。
public boolean isSymmetric(TreeNode root) {
return isMirror(root, root);
}
public boolean isMirror(TreeNode t1, TreeNode t2) {
if (t1 == null && t2 == null) return true;
if (t1 == null || t2 == null) return false;
return (t1.val == t2.val)
&& isMirror(t1.right, t2.left)
&& isMirror(t1.left, t2.right);
}
我不理解的解决方案部分是为什么解决方案的作者说时间复杂度是O(n)。假设我有输入:
1
/ \
2 2
在这种情况下,这就是我跟踪调用堆栈的方式:
isMirror(1, 1)
(t1.val == t2.val) returns true
isMirror(2, 2) returns true
(t1.val == t2.val) returns true
isMirror(null, null) return true
isMirror(null, null) return true
isMirror(2, 2) returns true
(t1.val == t2.val) returns true
isMirror(null, null) return true
isMirror(null, null) return true
在上面的调用堆栈中,isMirror()被调用7次,而n为3。对于时间复杂度为O(n),isMirror()应该仅被调用3次吗?还是我看错了方向?调用堆栈仅深入了3个级别,这表明时间复杂度为O(n),这是事实吗?
谢谢您的帮助。
答案 0 :(得分:1)
您也在空节点上调用镜像。因此,您的元素实际上不是3,而是3。考虑二进制树的下一级,您将看到。
解决方案;