LeetCode236. 二叉树的最近公共祖先

在这里插入图片描述


LeetCode236. 二叉树的最近公共祖先


题目:

  • 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 pq,最近公共祖先表示为一个节点 x,满足 xpq 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例:

在这里插入图片描述

  • 输入: r o o t = [ 3 , 5 , 1 , 6 , 2 , 0 , 8 , n u l l , n u l l , 7 , 4 ] , p = 5 , q = 1 root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 root=[3,5,1,6,2,0,8,null,null,7,4],p=5,q=1
  • 输出: 3 3 3
  • 解释: 节点 5 和节点 1 的最近公共祖先是节点 3

解题思路:(递归)

  1. 确定递归函数的参数和返回值:

    TreeNode* dfs(TreeNode* cur, TreeNode* p, TreeNode* q)
    
  2. 确定终止条件:
    当前节点为p或则q或者NULL都返回当前节点。

    if(cur == p || cur == q || cur == NULL) return cur;
    
  3. 确定单层递归的逻辑:
    递归左右子树,记录结果leftright,当左不空,右不空时,代表当前递归遍历节点为最近公共祖先;当左不空,右空时,left为最近公共祖先;当右不空,左空时,right为最近公共祖先。否则返回NULL

    TreeNode* left = dfs(cur->left, p, q);
    TreeNode* right = dfs(cur->right, p, q);
    if(left != NULL && right != NULL) return cur;
    if(left != NULL && right == NULL) return left;
    else if(left == NULL && right != NULL) return right;
    else return NULL;
    

C++版整体代码

class Solution {
public:
    TreeNode* dfs(TreeNode* cur, TreeNode* p, TreeNode* q){
        if(cur == p || cur == q || cur == NULL) return cur;
        TreeNode* left = dfs(cur->left, p, q);
        TreeNode* right = dfs(cur->right, p, q);
        if(left != NULL && right != NULL) return cur;
        if(left != NULL && right == NULL) return left;
        else if(left == NULL && right != NULL) return right;
        else return NULL;
    }
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        return dfs(root, p, q);
    }
};
  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值