文章目录
- [1. 题目介绍](#1. 题目介绍)
- [2. 题目解析](#2. 题目解析)
1. 题目介绍
2. 题目解析
这道题要求找到二叉树中两个结点的最近公共祖先 ,其中祖先可以是p,q两个结点自身。
首先,这样的最近公共祖先一定是存在的,因为祖先可以是结点自身,那么大致可以分为以下两种情况讨论。
可以分为两种情况:
1.公共祖先不是这两个结点自身。此时,p,q两结点一定在某一个结点的左右子树中,一边一个,而这个结点就是所求的公共祖先,
- 公共祖先是这两个结点自身(其中之一)。此时,一定是某一个结点,在另一个结点的子树中,左子树或右子树。
所以,根据上述分析,我们可以写这样一个递归dfs,它所要完成的任务是在一棵树中,这棵树给出根结点,去尝试找到 p,q结点,如果找到p,q结点,则将相应的p,q结点返回,否则返回 nullptr ; 当然,如果在此过程中,判断找到了第一种情况中的公共结点,就返回该公共结点。
那么,在上述递归思路下,递归中所要做的事为:仅关注处理当前状态,判断当前结点情况,符合条件返回,否则进一步递归左右子树,到左右子树中去找。
cpp
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* dfs(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root || root == p || root == q)
return root; // root为空, p, q 时返回
TreeNode* l = dfs(root->left, p, q);
TreeNode* r = dfs(root->right, p, q);
if(l && r)
return root; // 第一种公共祖先结点情况: 返回公共祖先结点
return l ? l : r; // 返回非空结点: p结点, q结点或作为第三者的公共祖先结点
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
return dfs(root, p, q);
}
};
