题目描述:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]
实例:
1.若输入为7,4,则返回2
2.若输入为5,2,则返回5
此函数主要解决几个功能:
- 若p,q都为NULL则返回NULL
- 若p,q有一个为NULL,则返回另一个
- 若p,q都不为NULL,则返回p,q的公共根
解题基本思路:
- 若root为NULL或root为p或q,则返回根
- 若根的左子树为空,返回右子树,若根的右子树为空,返回左子树
- 递归此函数,直到返回一个值
时间复杂度是O(n):每个结点最多遍历一次或用主定理,空间复杂度是O(n):需要系统栈空间
c++代码
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root || root == p || root == q)
return root;//!root即root==NULL;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if(!left)
return right;
if(!right)
return left;
return root;
}
};