题解
官方的题解就很清晰 https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/solution/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian--2/
方法一:递归
public class Solution
{public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q){if((p.val < root.val) && (q.val < root.val))return LowestCommonAncestor(root.left,p,q);else if((p.val > root.val) && (q.val > root.val))return LowestCommonAncestor(root.right,p,q);elsereturn root;}
}
方法二:迭代
这个方法跟方法一很接近。唯一的不同是,我们用迭代的方式替代了递归来遍历整棵树。由于我们不需要回溯来找到 LCA 节点,所以我们是完全可以不利用栈或者是递归的。实际上这个问题本身就是可以迭代的,我们只需要找到分割点就可以了。这个分割点就是能让节点 pp 和节点 qq 不能在同一颗子树上的那个节点,或者是节点 pp 和节点 qq 中的一个,这种情况下其中一个节点是另一个节点的父亲节点。
public class Solution
{public TreeNode LowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q){TreeNode node = root;while(node != null){if((p.val < node.val) && (q.val < node.val))node = node.left;else if((p.val > node.val) && (q.val > node.val))node = node.right;elsebreak;}return node;}
}