跳到主要内容

Java代码实现给定一个二叉树, 找到该树中两个指定节点的最近公共祖先 ?

参考答案:

在二叉树中找到两个指定节点的最近公共祖先,可以使用递归的方式进行搜索。下面是一个使用Java实现的例子:

首先,我们定义一个二叉树节点的类:

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

然后,我们定义一个方法来寻找两个节点的最近公共祖先:

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
    if (root == null || root == p || root == q) {
        return root;
    }

    TreeNode left = lowestCommonAncestor(root.left, p, q);
    TreeNode right = lowestCommonAncestor(root.right, p, q);

    if (left != null && right != null) {
        return root;
    }

    return left != null ? left : right;
}

这个方法首先检查根节点是否为空,或者是否与给定的节点p或q相等。如果是,那么它直接返回根节点。

然后,它递归地在左子树和右子树中查找节点p和q。如果两个子树中都找到了节点(即 left != null && right != null),那么当前根节点就是p和q的最近公共祖先。

如果只在左子树或右子树中找到了节点,那么它返回找到节点的那个子树。

这种方法的时间复杂度是O(n),其中n是二叉树中的节点数。在最坏的情况下,我们需要访问二叉树中的所有节点。空间复杂度也是O(n),因为递归调用栈可能包含所有节点。