1.题目
2.思路
如果当前节点是 null 或者是目标节点之一(p 或 q),直接返回当前节点。
递归左右子树:
左子树返回值为 l,右子树返回值为 r。
根据左右子树的返回值判断:
如果左子树返回 null,说明 p 和 q 都在右子树中,返回右子树的结果。
如果右子树返回 null,说明 p 和 q 都在左子树中,返回左子树的结果。
如果左右子树都不为 null,说明当前节点就是最近公共祖先,返回当前节点。
3.代码实现
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */classSolution{publicTreeNodelowestCommonAncestor(TreeNoderoot,TreeNodep,TreeNodeq){// 如果当前节点是 null 或者是目标节点之一(p 或 q),直接返回当前节点。// 递归左右子树:// 左子树返回值为 l,右子树返回值为 r。// 根据左右子树的返回值判断:// 如果左子树返回 null,说明 p 和 q 都在右子树中,返回右子树的结果。// 如果右子树返回 null,说明 p 和 q 都在左子树中,返回左子树的结果。// 如果左右子树都不为 null,说明当前节点就是最近公共祖先,返回当前节点。if(root==null||root==p||root==q){//单个节点,返回自身returnroot;}//递归遍历左右子树TreeNodeleft=lowestCommonAncestor(root.left,p,q);TreeNoderight=lowestCommonAncestor(root.right,p,q);if(left!=null&&right!=null){//如果左右子树都不为 null,说明当前节点就是最近公共祖先,返回当前节点returnroot;}//如果左子树为空elseif(left==null){//说明p,q都在右子树的节点中returnright;}else{//如果右子树为空,说明p,q都在左子树的节点中returnleft;}}}