题目介绍
力扣235题:leetcode-cn.com/problems/lo…
分析
这题让求二叉搜索树的最近公共祖先,而二叉搜索树的特点就是:左子树的所有节点都小于当前节点,右子树的所有节点都大于当前节点,并且每棵子树都具有上述特点,所以这题就好办了,从更节点开始遍历
- 如果两个节点值都小于根节点,说明他们都在根节点的左子树上,我们往左子树上找
- 如果两个节点值都大于根节点,说明他们都在根节点的右子树上,我们往右子树上找
- 如果一个节点值大于根节点,一个节点值小于根节点,说明他们他们一个在根节点的左子树上一个在根节点的右子树上,那么根节点就是他们的最近公共祖先节点。
画个图看一下,比如要找0和5的最近公共祖先节点,如下图所示
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
TreeNode result = null;
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
dfs(root , p , q);
return result;
}
public void dfs(TreeNode root, TreeNode p, TreeNode q) {
if(root.val > Math.max(p.val , q.val)) {
//说明两个节点都在当前根节点的左子树上
dfs(root.left , p , q);
}else if(root.val < Math.min(p.val , q.val)) {
//说明两个节点都在当前根节点的右子树上
dfs(root.right , p , q);
}else {
//找到最近公共祖先
result = root;
}
}
}