题目:
- 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树
T
的两个节点p
、q
,最近公共祖先表示为一个节点x
,满足x
是p
、q
的祖先且x
的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例:
- 输入: r o o t = [ 3 , 5 , 1 , 6 , 2 , 0 , 8 , n u l l , n u l l , 7 , 4 ] , p = 5 , q = 1 root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 root=[3,5,1,6,2,0,8,null,null,7,4],p=5,q=1
- 输出: 3 3 3
- 解释: 节点
5
和节点1
的最近公共祖先是节点3
。
解题思路:(递归)
-
确定递归函数的参数和返回值:
TreeNode* dfs(TreeNode* cur, TreeNode* p, TreeNode* q)
-
确定终止条件:
当前节点为p
或则q
或者NULL
都返回当前节点。if(cur == p || cur == q || cur == NULL) return cur;
-
确定单层递归的逻辑:
递归左右子树,记录结果left
和right
,当左不空,右不空时,代表当前递归遍历节点为最近公共祖先;当左不空,右空时,left
为最近公共祖先;当右不空,左空时,right
为最近公共祖先。否则返回NULL
。TreeNode* left = dfs(cur->left, p, q); TreeNode* right = dfs(cur->right, p, q); if(left != NULL && right != NULL) return cur; if(left != NULL && right == NULL) return left; else if(left == NULL && right != NULL) return right; else return NULL;
C++版整体代码
class Solution {
public:
TreeNode* dfs(TreeNode* cur, TreeNode* p, TreeNode* q){
if(cur == p || cur == q || cur == NULL) return cur;
TreeNode* left = dfs(cur->left, p, q);
TreeNode* right = dfs(cur->right, p, q);
if(left != NULL && right != NULL) return cur;
if(left != NULL && right == NULL) return left;
else if(left == NULL && right != NULL) return right;
else return NULL;
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
return dfs(root, p, q);
}
};