给定树递归问题的时间复杂度

时间:2018-09-30 18:11:35

标签: recursion time-complexity binary-tree

我正在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),这是事实吗?

谢谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您也在空节点上调用镜像。因此,您的元素实际上不是3,而是3。考虑二进制树的下一级,您将看到。

解决方案;

  • 尝试在调用该函数之前检查其无效性。
  • 这仍然是影响您费用的恒定因素。大约2次。按照大的O规则,您仍然是O(n)。