思路:要利用好二叉搜索树的特性,中序遍历是有序的,也就是说最近的公共祖先 大小一定落在区间 [p,q] 或[q,p]。
1、当p和q都大于当前root值时,说明当前root值太小,需要更大才能让它落入区间范围,所以要往右子树去遍历;
2、当p和q都小于当前root值时,同理,往左子树去遍历;
3、最后剩下情况就是 root值 在p值和q值之间的情况了,直接返回root。
这里是前序遍历中左右,从上到下,但是这里中不用处理;
实际代码中,log(N)时间复杂度。
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root == null) return null;//如果root值比两个值都大,说明公共节点在左子树if(root.val > p.val && root.val > q.val) {return lowestCommonAncestor(root.left,p,q);}//同理if(root.val < p.val && root.val < q.val) {return lowestCommonAncestor(root.left,p,q);} //剩下的是 root值 在p值和q值之间的情况return root; }
}