/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/classSolution{publicTreeNodelowestCommonAncestor(TreeNode root,TreeNode p,TreeNode q){//如果root为null表示前序遍历到了需要回溯的时候,返回null,表示没找到p和qif(root ==null|| root == p || root == q)return root;//但是如果root就是p和q中的一个,直接开始返回,表示找到了p或q//前序遍历,获取返回值,返回值为p或qTreeNode left =lowestCommonAncestor(root.left, p, q);//如果没找到p和q,就前序遍历继续找TreeNode right =lowestCommonAncestor(root.right, p, q);//如果left == null,说明当前结点的左子树没找到p或qif(left ==null)return right;//返回右子树//如果left找到了p或q,但是right == null,说明右子树没找到,返回leftif(right ==null)return left;//如果当前left和right都不为null,也就是left和right都找到了p和q,那么当前结点就是最近祖先结点,返回即可。return root;}}
2. 优化细节
优化思路
直接可以找到的公共祖先直接跳过返回
如果p 和 q是同一个结点,那么这个结点本身就是公共祖先
如果p是q的直接孩子,或者q是p的直接孩子,那么p或q就是最近公共祖先
前序遍历完成后,返回前,判断进行优化
不在进行left == null直接返回right,会多判断一次
改成如下形式,虽然代码多了,但是进入整体判断流程大大缩短
if(left !=null&& right !=null)return root;//如果左右子树都找到了,那么当前结点root是最近公共祖先elseif(left !=null&& right ==null)return left;//如果右子树是null,但是左子树找到了p或q,返回leftelseif(left ==null&& right !=null)return right;//如果左子树是null,但右子树找到p或q,返回rightelsereturnnull;//如果啥都没找到,返回null