算法-二叉树篇21-二叉树的最近公共祖先

二叉树的最近公共祖先

力扣题目链接

题目描述

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。“

解题思路

差点给我绕进去了,我的方法是递归遍历二叉树,返回值是找到了多少个目标节点,当第一次出现2时,把值归零。这样就可以找到最近的公共祖先了。
其中当节点等于目标节点中任意一个时,把值加一,然后把左右子树递归的返回值加上,这个值就是用来记录的,而且可以拓展至n个节点的最近公共祖先。
但是这个解法也是有局限性的,一方面找到公共祖先后仍然需要继续递归直至结束。

题解

class Solution {
public:
    int func(TreeNode* root, TreeNode* p, TreeNode* q, TreeNode*& ans) {
        if(!root) {
            return false;
        }

        int n = 0;
        if(root == p || root == q){
            n++;
        }
        n += func(root->left, p, q, ans);
        n += func(root->right, p, q, ans);
        if(n == 2){
            ans = root;
            n = 0;
        }

        return n;
    }

    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        TreeNode* ans = root;
        func(root, p, q, ans);
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值