6.20二叉树的最近公共祖先(LC236-M)

6.20二叉树的最近公共祖先(LC236-M)_第1张图片算法:

后序遍历:先看左右子树是否有p、q,再向上返回给中节点

调试过程:

6.20二叉树的最近公共祖先(LC236-M)_第2张图片

6.20二叉树的最近公共祖先(LC236-M)_第3张图片

原因:

当调用 `lowestCommonAncestor(left, p, q)` 和 `lowestCommonAncestor(right, p, q)` 时,没有使用或返回递归调用的返回值。

正确代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if (root == null) return null;
        if (root == p || root == q) return root;
        //左
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        //右
        TreeNode right = lowestCommonAncestor(root.right, p, q);
        //中(向上返回的处理逻辑)
//左右都不为空,说明左右子树有p和q,root就是最近公共祖先
        if (right !=null && left != null) return root;
//左空右不空,说明右子树有目标p或者q,把右子树向上返回,继续递归找另一个目标
        if (right !=null && left == null) return right;
//右空左不空,说明左子树有目标p或者q,把左子树向上返回,继续递归找另一个目标
        if (left !=null && right == null) return left;
//或者什么都没找到,就返回null
        else return null;

    }
}

时间空间复杂度:

时间复杂度

  • 在最坏情况下,我们需要遍历整棵树,因此时间复杂度为O(n),其中 n 是树中节点的数量。

空间复杂度

  • 递归调用在树的深度方面会占用空间。在最坏情况下,如果树是完全不平衡的,即链式的,空间复杂度为O(n)。在平衡二叉树的情况下,空间复杂度为 O(log⁡n)。

因此,这段代码的时间复杂度是 O(n),空间复杂度在最坏情况下是 O(n),在平衡二叉树的情况下是 O(log⁡n)。

你可能感兴趣的:(#,6.二叉树,算法,leetcode,职场和发展)