1、描述
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。
来源:力扣(LeetCode)
链接
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2、关键字
二叉树,公共祖先
二叉搜索树的最近公共祖先
3、思路
后序遍历,递归,求解
4、notes
这玩意不太会,背题解?反正知道是递归后序遍历,有模板,
一开始把特殊情况搞出来,不存在的直接返回null,还有祖先就是他俩自己也是直接返回。
然后第2部分:开始开启后序递归遍历。
第3步:如果左右孩子都不为空,就返回root, 如果有一个为空,就返回另外那个,不管另外那个是不是为空。
5、复杂度
时间:O(N)N是二叉树节点个数,最差情况下,需要遍历所有的节点。
空间:O(N)递归深度,最差情况下,递归深度也是N,
6、code
/**
* 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* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root) return NULL;
if(p == root || q == root) return root;
TreeNode * left = lowestCommonAncestor(root->left,p,q);
TreeNode * right = lowestCommonAncestor(root->right,p,q);
if(left != NULL && right != NULL) // 当左右都存在的时候就只有root才有可能
return root;
return left == NULL ? right:left;
//return right == NULL ? left:right; // 这样也可以
}
};