二叉树中每个节点能到达的最远距离

news2025/2/24 5:43:02

一、题目描述

输入一个只包含0和1的字符串表示二叉树,输出每个节点能到达的最远距离,通过父节点的路径也要考虑。

比如输入"111110000010000", 输出[3,2,4,3,3,4]。

          1A

        /       \

    1B        1C

    /  \         /  \

1D   1E    0   0

 / \    / \    / \   / \

0 0 0 1F 0 0 0 0

A->B->E->F为3, B->E->F为2,C->A->B->E->F为4,D->B->E->F或D->B->A->C为3,E->B->A->C为3,F->E->B->A->C为4,输出自然为[3,2,4,3,3,4]。

二、解题思路

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <unordered_map>
#include <queue>

using namespace std;

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};

// Build tree using level order traversal
TreeNode* buildTree(const string& s) {
    if (s.empty() || s[0] == '0') return nullptr;
    queue<TreeNode*> q;
    TreeNode* root = new TreeNode(1);
    q.push(root);
    int index = 1;
    int currentVal = 2;
    while (!q.empty() && index < s.size()) {
        TreeNode* node = q.front();
        q.pop();
        // Left child
        if (index < s.size()) {
            if (s[index] == '1') {
                node->left = new TreeNode(currentVal++);
                q.push(node->left);
            }
            index++;
        }
        // Right child
        if (index < s.size()) {
            if (s[index] == '1') {
                node->right = new TreeNode(currentVal++);
                q.push(node->right);
            }
            index++;
        }
    }
    return root;
}

unordered_map<TreeNode*, pair<int, int>> dp;

pair<int, int> dfsDown(TreeNode* node) {
    if (!node) return {-1, -1}; // Base case: null node has depth -1
    auto left = dfsDown(node->left);
    auto right = dfsDown(node->right);
    int cl = left.first + 1; // Edge count to left child
    int cr = right.first + 1;
    int longest = max(cl, cr);
    int second;
    if (cl > cr) {
        second = max(left.second + 1, cr);
    } else if (cr > cl) {
        second = max(cl, right.second + 1);
    } else {
        second = max(left.second + 1, right.second + 1);
    }
    dp[node] = {longest, second};
    return {longest, second};
}

void dfsUp(TreeNode* node, TreeNode* parent, int up, vector<int>& result) {
    if (!node) return;
    int currentUp = 0;
    if (parent) {
        int siblingLongest = -1;
        if (parent->left == node && parent->right) {
            siblingLongest = dp[parent->right].first;
        } else if (parent->right == node && parent->left) {
            siblingLongest = dp[parent->left].first;
        }
        currentUp = max(up + 1, siblingLongest + 2);
    }
    result[node->val - 1] = max(dp[node].first, currentUp);
    dfsUp(node->left, node, currentUp, result);
    dfsUp(node->right, node, currentUp, result);
}

vector<int> maxDistances(string s) {
    TreeNode* root = buildTree(s);
    if (!root) return {};
    dp.clear();
    dfsDown(root);
    int maxNode = 0;
    for (auto& pair : dp) maxNode = max(maxNode, pair.first->val);
    vector<int> result(maxNode, 0);
    dfsUp(root, nullptr, 0, result);
    return result;
}

int main() {
    string input = "111110000010000";
    vector<int> output = maxDistances(input);
    for (int dist : output) {
        cout << dist << " ";
    }
    // Output: 3 2 4 3 3 4
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2304214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单机上使用docker搭建minio集群

单机上使用docker搭建minio集群 1.集群安装1.1前提条件1.2步骤指南1.2.1安装 Docker 和 Docker Compose&#xff08;如果尚未安装&#xff09;1.2.2编写docker-compose文件1.2.3启动1.2.4访问 2.使用2.1 mc客户端安装2.2创建一个连接2.3简单使用下 这里在ubuntu上单机安装一个m…

家用路由器的WAN口和LAN口有什么区别

今时今日&#xff0c;移动终端盛行的时代&#xff0c;WIFI可以说是家家户户都有使用到的网络接入方式。那么路由器当然也就是家家户户都不可或缺的设备了。而路由器上的两个实现网络连接的基础接口 ——WAN 口和 LAN 口&#xff0c;到底有什么区别&#xff1f;它们的功能和作用…

实操解决Navicat连接postgresql时出现‘datlastsysoid does not exist‘报错的问题

1 column “datlastsysoid“ does not exist2 Line1:SELECT DISTINCT datalastsysoid FROM pg_database问题分析 Postgres 15 从pg_database表中删除了 datlastsysoid 字段引发此错误。 决绝方案 解决方法1&#xff1a;升级navicat 解决方法2&#xff1a;降级pgsql 解决方…

3分钟idea接入deepseek

DeepSeek简介 DeepSeek 是杭州深度求索人工智能基础技术研究有限公司开发的一系列大语言模型&#xff0c;背后是知名量化资管巨头幻方量化3。它专注于开发先进的大语言模型和相关技术&#xff0c;拥有多个版本的模型&#xff0c;如 DeepSeek-LLM、DeepSeek-V2、DeepSeek-V3 等&…

树莓派理想二极管电路分析

如果 Vin Vout&#xff0c;比如说 5.0V&#xff0c;PNP 晶体管以当前的镜像配置偏置。晶体管 U14 的 Vb 将为 5-0.6 4.4V&#xff0c;镜像配置意味着 Vg 也将为 4.4V. Vgs 为4.4-5.0 -0.6V。mosfet 将处于关闭状态&#xff08;几乎打开&#xff09;。如果 Vout 略低于 Vin&a…

Unity贴图与模型相关知识

一、贴图 1.贴图的类型与形状 贴图类型 贴图形状 2.在Unity中可使用一张普通贴图来生成对应的法线贴图&#xff08;但并不规范&#xff09; 复制一张该贴图将复制后的贴图类型改为Normal Map 3.贴图的sRGB与Alpha sRGB&#xff1a;勾选此选项代表此贴图存储于Gamma空间中…

Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)

一、进程虚拟地址空间 这里以kernel 2.6.32&#xff0c;32位平台为例。 1.空间布局 在 32 位系统中&#xff0c;虚拟地址空间大小为 4GB。其中&#xff1a; 内核空间&#xff1a;占据高地址的 1GB &#xff0c;用于操作系统内核运行&#xff0c;包含内核代码、内核数据等&am…

中间件专栏之redis篇——redis基本原理、概念及其相关命令介绍

一、redis是什么 redis是remote dictionary service的简称&#xff0c;中文翻译为远程字典服务&#xff1b; redis是一种数据库&#xff0c;若按照类型来归类&#xff0c;则其可以被归入三个类型数据库&#xff0c;分别为&#xff1a;内存数据库、KV数据库、数据结构数据库&a…

在列线图上标记做为线性模型的局部解释

改造列线图做为线性模型的解释 除了使用列线图算法产生的meta数据和score数据进行线性模型的解释&#xff08;全局性解释和局部性解释&#xff09;&#xff0c;另外一种做法是改造列线图来作为线性模型的解释。这里尝试改造列线图来对线性模型进行全局性和局部性解释。 全局…

KubeKey一键安装部署k8s集群和KubeSphere详细教程

目录 一、KubeKey简介 二、k8s集群KubeSphere安装 集群规划 硬件要求 Kubernetes支持版本 操作系统要求 SSH免密登录 配置集群时钟 所有节点安装依赖 安装docker DNS要求 存储要求 下载 KubeKey 验证KubeKey 配置集群文件 安装集群 验证命令 登录页面 一、Ku…

车载诊断数据库 --- AUTOSAR诊断文件DEXT简介

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

庙算兵棋推演AI开发初探(5-数据处理)

碎碎念&#xff1a;这最近几个月过得那叫一个难受&#xff0c;研究生开题没过、需求评审会在4月和6月开了2次、7月紧接着软件设计评审会&#xff0c;加班干得都是文档的事情&#xff0c;还有开会前的会务和乱七八糟的琐事&#xff0c;我们干的还被规定弄的束手束脚&#xff0c;…

【MyBatis】#{} 与 ${} 的区别(常见面试题)

目录 前言 预编译SQL和即时SQL 什么是预编译SQL&#xff1f; 什么是即时SQL&#xff1f; 区别 #{} 与 ${}的使用 防止SQL注入 什么是SQL注入&#xff1f; 原理 排序功能 模糊查询 总结#{}和${}的区别 前言 在前面的学习中&#xff0c;我们已经知道了如果SQL语句想…

鸿蒙开发环境搭建-入门篇

本文章讲述如何搭建鸿蒙应用开发环境&#xff1a;新建工程、虚拟机运行、真机调试等。 开发工具: DevEco Studio 5.0.3.906 os系统: mac 参考文档&#xff1a;https://juejin.cn/post/7356143704699699227 官网鸿蒙应用开发学习文档&#xff1a;https://developer.huawei.com/c…

iOS开发 网络安全

iOS开发中的网络安全 在当前的数字化时代&#xff0c;任何应用程序都需要重视网络安全。尤其是对于iOS应用开发者而言&#xff0c;确保应用与服务器之间的数据传输安全是至关重要的。接下来&#xff0c;我们将学习“iOS开发 网络安全”的实现过程。 流程步骤 以下是实现iOS网…

MATLAB在投资组合优化中的应用:从基础理论到实践

引言 投资组合优化是现代金融理论中的核心问题之一&#xff0c;旨在通过合理配置资产&#xff0c;实现风险与收益的最佳平衡。MATLAB凭借其强大的数学计算能力和丰富的金融工具箱&#xff0c;成为投资组合优化的理想工具。本文将详细介绍如何使用MATLAB进行投资组合优化&#…

银河麒麟系统安装mysql5.7【亲测可行】

一、安装环境 cpu&#xff1a;I5-10代&#xff1b; 主板&#xff1a;华硕&#xff1b; OS&#xff1a;银河麒麟V10&#xff08;SP1&#xff09;未激活 架构&#xff1a;Linux 5.10.0-9-generic x86_64 GNU/Linux mysql版本&#xff1a;mysql-5.7.34-linux-glibc2.12-x86_64.ta…

自动创建spring boot应用(eclipse版本)

使用spring starter project创建项目 设置Service URL 把Service URL设置为 https://start.aliyun.com/ 如下图&#xff1a; 使用这个网址&#xff0c;创建项目更快。 选择Spring Web依赖 项目结构 mvnw和mvnw.cmd:这是maven包装器&#xff08;wrapper&#xff09;脚本&…

基于Flask的第七次人口普查数据分析系统的设计与实现

【Flask】基于Flask的第七次人口普查数据分析系统的设计与实现&#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 基于Flask的人口普查可视化分析系统 二、项目界面展示 登录/注册 首页/详情 …

Linux:文件(三)

1. 磁盘 基本概念 机械磁盘在现在的计算机中基本是唯一的一个机械设备 速度较内存更慢&#xff0c;容量大价格便宜。 磁盘是永久性存储介质&#xff0c;断电后数据还在。 内存是易失性存储介质&#xff0c;断电后(未写入磁盘的)数据丢失。 物理存储结构 扇区&#xff1a;…