【问题标题】:Time Complexity for the given Tree Recursion problem给定树递归问题的时间复杂度
【发布时间】:2019-03-05 22:49:01
【问题描述】:

我正在查看 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)?

感谢您的帮助。

【问题讨论】:

    标签: recursion time-complexity binary-tree


    【解决方案1】:

    您也在空节点上调用镜像。所以你的元素实际上不是 3,而是 7。想想二叉树的下一层,你就会看到。

    解决方案;

    • 在调用函数之前尝试检查无效性。
    • 它仍然是您成本的不变因素。大约2次。根据大 O 规则,您仍然是 O(n)。

    【讨论】:

    • 感谢@kelalaka 的解释和解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多