本文参考代码随想录
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
思路:采用后序遍历对二叉树进行回溯
判断节点p,q的公共祖先:
- 遍历过程中如果遇到p则返回p,遇到q则返回q,若某节点的左右子树递归返回值都不为0,则是p,q的最近公共祖先
- q(p)是p(q)的子孙节点,包含在情况1中,因为最终会返回在上面的节点。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == q || root == p || root == NULL) return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if(left != NULL && right != NULL) return root;
if(left == NULL && right != NULL) return right;
else if (left != NULL && right == NULL) return left;
else {
return NULL;
}
}
};