这一题还是比较困难的,要找到p和q的公共祖先就说明我们需要从下往上遍历,这样我们就需要采用后续遍历,左右中,如果找到p或者q就返回这个节点给父亲节点,否则就返回null,如果一个节点的左右返回值都不为空,说明这个节点就是最近的公共祖先。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//确定递归结束条件
if(root == null ){
return root;
}
//碰到p或者q直接返回给父亲节点。
if(root == p || root == q ){
return root;
}
//需要从下往上处理数据 因此采用后续
TreeNode left = lowestCommonAncestor(root.left,p,q);
TreeNode right = lowestCommonAncestor(root.right,p,q);
//中间处理逻辑
if(left == null && right == null){
//这种情况没有碰到p或者q
return null;
}
else if(left != null && right == null){
//遇到p或者q其中一个
return left;
}
else if(left == null && right!=null){
//遇到p或者q其中一个
return right;
}else{
return root;
}
}
}
总结:需要弄清楚,采用的遍历方式,还有递归结束的条件,让我们的root遇到p或者q的时候就直接返回给上一层的父亲节点,如果左右都不为空才是我们需要找到的最近公共祖先。
这一题和上一题的思路差不多,但是要更简单一些,因为这一棵树是二叉搜索树,我们需要利用好二叉搜索树的特性根节点的左孩子都比跟节点的值要小,跟节点的右孩子都比跟节点大,因此利用好这个特性可以更快的找到最近公共祖先,因为二叉搜索树已经帮我们决定好了搜索的方向。
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
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.right, p, q);
return root;
}
}
总结:和上一题的思路是差不多的,利用好二叉搜索树的特性可以更简单的完成这一题。