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),因为递归调用栈可能包含所有节点。