目录
前言
在二叉搜索树(BST)中,最近公共祖先(Lowest Common Ancestor,LCA)是一个关键问题,广泛应用于路径规划、社交网络分析、文件系统管理等场景。本文将通过迭代法和递归法两种方式,详细讲解如何在 BST 中高效求解 LCA,并对比两种方法的优劣。
一、什么是最近公共祖先(LCA)?
在二叉树中,两个节点 p 和 q 的最近公共祖先是指同时包含 p 和 q 的最深节点。对于 BST,由于节点值具有有序性,我们可以利用这一特性快速定位 LCA。
示例(leetcode235):
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

示例 1:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8 输出: 6 解释: 节点 2 和节点 8 的最近公共祖先是 6。
示例 2:
输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4 输出: 2 解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。
二、迭代法求解 BST 的 LCA
1、思路讲解:
做过二叉树公共祖先问题的同学应该知道,利用回溯从底向上搜索,若一个节点的左子树里含p,右子树里含q,则该节点是最近公共祖先。现在是二叉搜索树,可以利用其有序性:如果中间节点是 q 和 p 的公共祖先,其数值必定在 [p, q]闭区间中。那只要从上到下遍历,若遇到节点的数值在[p, q]闭区间中,则说明该节点就是p 和 q的公共祖先。
迭代法通过循环模拟递归过程,避免了递归的函数调用开销。
关键步骤:
- 从根节点开始遍历。
- 如果当前节点的值大于
p和q的值,则向左子树移动。 - 如果当前节点的值小于
p和q的值,则向右子树移动。 - 否则,当前节点就是 LCA。
2、关键函数讲解
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
TreeNode* current = root;
while (current) {
if (current->val > p->val && current->val > q->val) {
current = current->left;
} else if (current->val < p->val && current->val < q->val) {
current = current->right;
} else {
return current;
}
}
return nullptr;
}
lowestCommonAncestor函树中使用迭代方法遍历树,首先定义一个指针 current,初始化为根节点 root,用于遍历。开始一个 while 循环,遍历到叶子节点为止。如果current 节点的值

804

被折叠的 条评论
为什么被折叠?



