当前位置: 首页 > article >正文

力扣--二叉树的最近公共祖先

思路:

  1. 首先,我们采用后根遍历【这种遍历方式非常适合这个问题,因为我们要找的是最深的(即离根最远的)公共祖先,所以我们应该从底部向上工作,先找到子树中的最近公共祖先,再逐步返回到更高的层次。】
  2. 其次,我们理清思路,大致分为三种情况:①两个节点在根节点的两侧,那么应该返回根节点。② p 为根节点,返回 p。③ q 为根节点,返回 q。
  3. 根据后根遍历的思想,首先采用dfs获取左子树中的最近公共祖先left,右子树的最近公共祖先right,然后来判断以下四种情况:①left和right都为空,那么说明没有找到最近公共祖先,返回空。②left为空,right不为空,说明p和q都在根节点的一侧,返回right即可。③同理,left不为空,right为空,返回left即可。④left和right都不为空,说明p和q在根节点的两侧,返回根节点即可。

代码:

C++:

/**
 * 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==nullptr ||root==p||root==q){return root;}
        TreeNode* left=lowestCommonAncestor(root->left,p,q);
        TreeNode* right=lowestCommonAncestor(root->right,p,q);
        if(left==nullptr && right==nullptr){return nullptr;}
        else if(left==nullptr){return right;}
        else if(right==nullptr){return left;}
        else{return root;}
    }
};

Python:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def lowestCommonAncestor(self, root: 'TreeNode', p: 'TreeNode', q: 'TreeNode') -> 'TreeNode':
        if root==None or root==p or root==q:
            return root
        left=self.lowestCommonAncestor(root.left,p,q)
        right=self.lowestCommonAncestor(root.right,p,q)
        if left==None and right==None:
            return None
        elif left==None:
            return right
        elif right==None:
            return left
        else:
            return root


http://www.kler.cn/a/272017.html

相关文章:

  • deeplabv3+街景图片语义分割,无需训练模型,看不懂也没有影响,直接使用,cityscapes数据集_12
  • Day 15 卡玛笔记
  • STM32-CAN总线
  • Qt Creator 15.0.0如何更换主题和字体
  • github登录用的TOTP和恢复码都丢失了怎么办
  • docker 部署confluence
  • Linux查看硬件型号详细信息
  • 在 Rust 中使用 Serde 处理json
  • 华为三层交换机:ACL的基本实验
  • 数据库基本知识
  • Kotlin:为什么创建类不能被继承
  • 88. 合并两个有序数组 (Swift版本)
  • sxf-漏洞研究员实习
  • DFL《384底丹 430万》 wf/df-udt/448/96/96/32预训练模型
  • unet各模块内容的理解(包含注意力机制、残差、以及数据维度的变化)
  • 软件杯 深度学习 python opencv 动物识别与检测
  • 最强AI换脸工具Rope使用教程,Rope整合包下载【全网最全安装步骤】
  • 内存函数memcpy和memmove的讲解
  • 科技回顾,飞凌嵌入式受邀亮相第八届瑞芯微开发者大会「RKDC2024」
  • scrcpy远程投屏控制Android
  • 计算机等级考试:信息安全技术 知识点十二
  • vue2+vant2+Laravel7 实现多图上传到七牛云
  • 教你申请腾讯云免费服务器,准备好账号
  • SpringBoot(整合MyBatis + MyBatis-Plus + MyBatisX插件使用)
  • echo,date,bc命令详解
  • 模型、算法、数据模型、模型结构是什么?它们之间有什么关联和区别?