Sword68-I——二叉搜索树的最近公共祖先
方法1——迭代
- 思路:利用好二叉搜索树的性质,即左子树元素均比根节点小,右子树元素均比根节点大,这就可以找出此次终止条件
- 从根节点进行比较,分为以下几种情况
- 当前节点值比p、q都要大,则p、q存在于当前节点的左子树中
- 当前节点值比p、q都要小,则p、q存在于当前节点的右子树中
- 当前节点值比p、q中一方要大,比另一方要小;或者p、q自身为当前节点,即证明当前节点为p、q的最近公共祖先
- 特殊情况与临界分析:无
- 终止条件:无
- 步骤:
- while循环
- 循环条件:当前节点非空
- 当前节点值比p、q都要大,向当前节点左子树进行查找
- 当前节点值比p、q都要小,向当前节点右子树进行查找
- 当前节点值比p、q中一方要大,比另一方要小;或者p、q自身为当前节点,即证明当前节点为p、q的最近公共祖先
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while (root != null) {
if (root.val > p.val && root.val > q.val) {
root = root.left;
}
else if (root.val < p.val && root.val < q.val) {
root = root.right;
}
else {
break;
}
}
return root;
}

方法2——递归
- 思路:原理同上方法
- 特殊情况与临界分析:无
- 终止条件:无
- 步骤:
- 当前节点值比p、q都要大,向当前节点左子树递归进行查找
- 当前节点值比p、q都要小,向当前节点右子树递归进行查找
- 当前节点值比p、q中一方要大,比另一方要小;或者p、q自身为当前节点,即证明当前节点为p、q的最近公共祖先;即其他情况,直接返回当前节点,即为递归终止条件
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if (root.val > p.val && root.val > q.val) {
return lowestCommonAncestor(root.left, p, q);
}
else if (root.val < p.val && root.val < q.val) {
return lowestCommonAncestor(root.right, p, q);
}
return root;
}
