首页 > 其他分享 >leetcode236求最近公共祖先

leetcode236求最近公共祖先

时间:2023-08-25 14:55:05浏览次数:45  
标签:leetcode236 right TreeNode 祖先 公共 return root 节点 left

  • 递归
TreeNode* dfs(TreeNode* root,TreeNode* p,TreeNode* q){
    if(!root)return root;//当发现这个节点已经是叶节点时,要告诉上层
    if(root==p||root==q)return root;//当发现是p节点或者q时也要告诉上层
    TreeNode* left=dfs(root->left,p,q);//左子树是否有p或者q
    TreeNode* right=dfs(root->right,p,q);//右子树是否有
    if(left&&right)return root;
    if(left&&!right)return left;
    if(right&&!left)return right;//说明现在的子树的根节点是 p或者q,而右子树没有p或者q,说明p、q是在一个子树上
    return nullptr;
}
  •  用哈希表存每个节点的父节点,然后找p节点开始从下而上遍历,走过的就标记。再重复从q从上而下遍历只要遇见之前已经走过的节点就返回为公共祖先。
unordered_map<int ,TreeNode*>f;
unorederd_map<int,bool>vis;
void dfs(TreeNode* root){
    if(root->left){
        f[root->left]=root;
        dfs(root->left);
    }
    if(root->right){
        f[root->right]=root;
        dfs(root->right);
    }
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q){
    f[root->val]=nullptr;
    while(p){
        vis[p->val]=true;
        p=f[p->val];
    }
    while(q){
        if(vis[q->val])return q;
        q=f[q->val];
    }
    return nullptr;//没有公共祖先
}

 

标签:leetcode236,right,TreeNode,祖先,公共,return,root,节点,left
From: https://www.cnblogs.com/wangkaixin-yy/p/17656919.html

相关文章

  • 【LeetCode动态规划#15】最长公共子序列II
    最长公共子序列(二)描述给定两个字符串str1和str2,输出两个字符串的最长公共子序列。如果最长公共子序列为空,则返回"-1"。目前给出的数据,仅仅会存在一个最长的公共子序列数据范围:0≤∣���1∣,∣���2∣≤20000≤∣str1∣,∣str2∣≤2000要求:空间复杂度�(�2)O(n2),时间复杂度�(�2)O(n2)......
  • 二叉树的最近公共祖先
    235.二叉搜索树的最近公共祖先-力扣(LeetCode)经验1:在二叉树中找满足条件的结点的问题一般使用后续遍历,也就是说如果找到了这个结点那么就将它返回给上层,然后层层返回最终返回到根结点经验2:本题的解题技巧:如果在某一结点找到了p或q,那么就不用往下递归了,直接将这个结点返回,即便......
  • 代码随想录算法训练营第二十一天| 530.二叉搜索树的最小绝对差 501.二叉搜索树中的
     530.二叉搜索树的最小绝对差   卡哥建议:需要领悟一下二叉树遍历上双指针操作,优先掌握递归   题目链接/文章讲解:https://programmercarl.com/0530.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E5%B0%8F%E7%BB%9D%E5%AF%B9%E5%B7%AE.html ......
  • 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先(简单)
    题目:classSolution{public:TreeNode*lowestCommonAncestor(TreeNode*root,TreeNode*p,TreeNode*q){//依旧要利用二叉搜索树的性质if(root->val>p->val&&root->val>q->val)returnlowestCommonAncestor(root->left,p,q);/......
  • mybatis-plus公共字段自动填充与ThreadLocal
    1、为什么使用mybatisplus自动填充在项目开发中,我们会发现有一些数据库表字段是每个表都有的,在之前针对这些字段我们的目前的处理方式就是增加或者修改的时候一个一个的去赋值,如果都按这样的方法进行操作的话,那我们就需要在每个业务方法中进行操作,这样会显得我们的代码过于冗余......
  • 动态规划--最长公共子序列( LCS 问题)
    博客地址:https://www.cnblogs.com/zylyehuo/#-*-coding:utf-8-*-#最长公共子序列的长度deflcs_length(x,y):m=len(x)n=len(y)c=[[0for_inrange(n+1)]for_inrange(m+1)]foriinrange(1,m+1):forjinr......
  • vue2公共组件=》筛选条件
    源码<template><divclass="c__filter":style="`height:${showFilter?'auto':'47px'}`"v-if="filterNum>0"ref="tableFilter"><divclass="c_filte......
  • 【算法学习笔记】DFN序求LCA(最近公共祖先)
    前置知识DFN序:对一棵树进行深度优先搜索DFS得到的结点序列,即深度优先搜索DFS的访问顺序。该表述不一定严谨,建议百度ST表(SparseTable,稀疏表)算法概述引理1.1在DFN序中祖先一定出现后代之前。考虑一树上的两个节点\(x\),\(y\)的最近公共祖先\(d\),设\(x\)的DFN序......
  • LeetCode 1143.最长公共子序列
    1.题目:给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,"......
  • ThingsKit物联网平台可视化工具之大屏公共接口配置
    概述在大屏设计器中,主要是提供一些标准接口和过滤器,以便在大屏设计器中,供各个大屏可以调用该公共接口;接口属于通用性接口,具体交互和以及参数配置都是在大屏设计页面中完成;不同的接口,参数配置不同。功能说明新增接口首先,进入公共接口管理页;单击“新增公共接口”按钮,在弹出的新......