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

Leetcode 1223 LCA of Deepest TreeNode

题意,找到所有最深的叶子节点的LCA
https://leetcode.com/problems/lowest-common-ancestor-of-deepest-leaves/description/

第一个想法是模块的想法, LCA +找到所有最深的叶子节点两两组合 可行,但是算法复杂度很高而且你先要从顶到下,再从下到顶再算一遍算法复杂度太高

第二个想法,利用后续位置进行计算,好处是,我在后续位置可以知道更多的信息,比如左右子树的深度信息此时是已知的。二叉树的分治算法本质上是一种后序遍历。
构造一个函数,这个函数能够返回一个lcaDeepestLeaves+以root为根的树的深度,如果左子树的深度 > 右子树的深度,我只需要返回左子树的答案,因为这意味着左边深度大,右边的叶子节点都被舍弃了,反之对右子树也成立
但是如果一样深,那我要返回root

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* lcaDeepestLeaves(TreeNode* root) {
        return dfs(root).second;
    }
    pair<int, TreeNode*> dfs(TreeNode* node) {
        if (!node) {
            return {0, nullptr};
        }
        auto left = dfs(node->left);
        auto right = dfs(node->right);
        if(left.first > right.first) {
            return {left.first + 1, left.second};
        } else
            if (left.first < right.first) {
                return {right.first + 1, right.second};
            }
        return {left.first + 1, node};
        }
    };

http://www.kler.cn/news/355089.html

相关文章:

  • 带头结点的单链表按数据域从小到大进行选择排序的算法
  • 生成器和迭代器
  • Mysql 5.7 安装与卸载(非常详细)
  • 【原创】java+springboot+mysql智能农村管理系统设计与实现
  • OpenUAV:首个专为现实无人机视觉语言导航设计的大规模轨迹数据集,由大约 12k 个轨迹组成,涵盖了多种环境和复杂的飞行动态。
  • laravel清除不同缓存
  • 疾病防控|基于springBoot的疾病防控综合系统设计与实现(附项目源码+论文+数据库)
  • 海康相机
  • 通信学习干货:运营商为什么要大力推广FTTR?
  • 2. 继承Mono的单例模式基类
  • 一文搞懂模型倍率怎么计算的,以及模型分组倍率原理!
  • Java | Leetcode Java题解之第480题滑动窗口中位数
  • 决策树C4.5算法详解及实现
  • openEuler-22.03-SP4离线编译安装ZLMediaKit
  • A Survey on 3D Gaussian Splatting 整理
  • XML 和 SimpleXML 简介
  • linux环境下的程序设计与git操作
  • 【MySQL】入门篇—基本数据类型:NULL值的概念
  • 利用mydumper从MySQL迁移数据到OceanBase数据库命令记录
  • PHP学习记录-编辑器推荐和本地环境的安装