*
https://segmentfault.com/a/1190000009429876
首先要先确定给的两个node是否都在tree里,如果都在tree里的话,就可以分成3种情况,
第一种情况是两个节点是在公共祖先的左右两侧,第二种情况是都在树的左侧,
第三种情况是都在树的右侧,如果是第二,第三种情况的话,公共祖先就在给定的两个点中比较上面的那一个。
如果转换成代码的话,从上往下走,base case分为3种,判断遇到了p就直接返回p,遇到q就直接返回q,不用向下做了。
如果left,right都不为空,就返回root自己;left,right哪一个不为空就返回哪个,整个recursion做完就可以得到LCA。
*/
public class no236_LowestCommonAncestorofaBinaryTree {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//三种情况最终都会递归到下面三个if里,然后才能进行下面的判断
if(root == null) return null;// 这个对应p,q 走在root一边的情况,left 或者right有一个为null
if(root == p) return p;//
if(root == q) return q;//
//分三种情况分别举一个简单的例子就可以理解了
TreeNode left = lowestCommonAncestor(root.left, p, q);
TreeNode right = lowestCommonAncestor(root.right, p, q);
//第一种情况是两个节点是在公共祖先的左右两侧
if(left != null && right != null) return root;
//第二种情况是都在树的左侧,
//第三种情况是都在树的右侧
return left != null ? left : right;
}
}
leetcode 236 Lowest Common Ancestor of a Binary Tree
最新推荐文章于 2024-02-06 06:38:28 发布