LeetCode 236
传送门:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
示例 1:
输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。
示例 2:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。说明:
所有节点的值都是唯一的。
p、q 为不同节点且均存在于给定的二叉树中。
这个题跟https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/ 有点像,只不过235给出的是二叉搜索树,而236给出的是普通二叉树
对于235题,根据其特性我们可以快速的解决。如果root在pq之间,说明root就是其根节点。如果p,q都大于root,那么其跟节点一定在root的右手边,反之亦然。
但是236题失去了这个特性,一开始我也没想明白,后来看了答案才知道这么清晰明了。
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 class Solution { 11 public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { 12 if(root == null){ 13 return root; 14 } 15 if(root ==p || root == q){ 16 return root; 17 } 18 TreeNode left = lowestCommonAncestor(root.left,p,q); 19 TreeNode right = lowestCommonAncestor(root.right,p,q); 20 if(left!=null && right != null){ 21 return root; 22 }else if (left != null){ 23 return left; 24 }else if (right != null){ 25 return right; 26 } 27 return null; 28 } 29 }
如果root==null,表示访问到了叶子节点,我们直接返回null。
对于根节点就是p,q之中的一个,我们直接返回根节点,表示已经找到了其中一个。
然后我们递归调用方法寻找左子树和右子树中是否存在p或者q。
最后我们根据返回值进行判断:
返回的左右节点不为空,那么root就是公共祖先。
否则返回其中不为空的值