2641. 二叉树的堂兄弟节点 II - 力扣(LeetCode)

题目描述

给你一棵二叉树的根 root ,请你将每个节点的值替换成该节点的所有 堂兄弟节点值的和 。

如果两个节点在树中有相同的深度且它们的父节点不同,那么它们互为 堂兄弟 。

请你返回修改值之后,树的根 root 。

注意,一个节点的深度指的是从树根节点到这个节点经过的边数。

题目示例

输入:root = [5,4,9,1,10,null,7]
输出:[0,0,0,7,7,null,11]
解释:上图展示了初始的二叉树和修改每个节点的值之后的二叉树。
值为 5 的节点没有堂兄弟,所以值修改为 0 。
值为 4 的节点没有堂兄弟,所以值修改为 0 。
值为 9 的节点没有堂兄弟,所以值修改为 0 。
值为 1 的节点有一个堂兄弟,值为7,所以值修改为7。
值为 10 的节点有一个堂兄弟,值为7,所以值修改为7。
值为 7 的节点有两个堂兄弟,值分别为 1 和 10,所以值修改为 11。

解题思路

题目要求将二叉树中每个节点的值替换为所有堂兄弟节点的和,而堂兄弟节点就是指那些和当前节点深度相同但父节点不同的节点。例如下图中,x 的堂兄弟节点是第 n 层除去 x 和 y 的其他所有节点。假设第 n 层所有节点的和为 sum,那么 x 的值应该被替换为 sum−x−y。
在这里插入图片描述

在广度优先搜索的过程中,通过第 n−1 层去遍历第 n 层的节点时,可以顺便统计第 n 层节点的和 sum。由于更新 x 的值时需要知道 y 的值(有可能不存在),因此需要通过 n−1 层对第 n 层进行第二次遍历,这时就可以使用 sum−x−y 更新 x 的值了。

在代码实现时,我们需要遍历每一层的节点两次,因此使用动态数组或链表表示的队列会更方便。

参考代码

class Solution {
    public TreeNode replaceValueInTree(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        root.val = 0;
        // 通过队列来
        while(!queue.isEmpty()) {
            // 统计下一层的节点,用于遍历
            Queue<TreeNode> queue2 = new LinkedList<>();
            int sum = 0;
            // 遍历 n-1 层时,统计 n 层的总和 sum
            for(TreeNode fa : queue) {
                if(fa.left != null) {
                    queue2.add(fa.left);
                    sum += fa.left.val;
                }
                if(fa.right != null) {
                    queue2.add(fa.right);
                    sum += fa.right.val;
                }
            }
            for(TreeNode fa : queue) {
                // 当前节点的左右孩子节点之和
                int childSum = (fa.left != null ? fa.left.val : 0)
                + (fa.right != null ? fa.right.val : 0);
                // 将左右孩子的值改为 sum-childSum
                if(fa.left != null) {
                    fa.left.val = sum - childSum;
                }
                if(fa.right != null) {
                    fa.right.val = sum - childSum;
                }
            }
            queue = queue2;
        }
        return root;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Java程序设计》实验报告(三)之常用类和集合类

实验内容及步骤&#xff1a; 编写String类的程序。&#xff08;1&#xff09;代码&#xff1a; public class TeatString3 { public static void main(String[] args) { String str"abcd"; System.out.print("将字符串转换为字符数组后…

Text2SQL研究-Chat2DB体验与剖析

文章目录 概要业务数据库配置Chat2DB安装设置原理剖析 小结 概要 近期笔者在做Text2SQL的研究&#xff0c;于是调研了下Chat2DB&#xff0c;基于车辆订单业务做了一些SQL生成验证&#xff0c;有了一点心得&#xff0c;和大家分享一下.&#xff1a; 业务数据库设置 基于车辆订…

腾讯云游戏联机服务器配置价格表,4核16G/8核32G/4核32G/16核64G

2024年更新腾讯云游戏联机服务器配置价格表&#xff0c;可用于搭建幻兽帕鲁、雾锁王国等游戏服务器&#xff0c;游戏服务器配置可选4核16G12M、8核32G22M、4核32G10M、16核64G35M、4核16G14M等配置&#xff0c;可以选择轻量应用服务器和云服务器CVM内存型MA3或标准型SA2实例&am…

BATSIGN 世界上最简单的个人电子邮件通知 API

引言 今天看邮箱&#xff0c;发现有封邮件&#xff0c;在垃圾箱&#xff0c;看了一眼挺真诚的不是骗子&#xff0c;应该是应用者进行宣传什么的&#xff0c;也挺不容易的。 注意&#xff1a;基于安全反欺诈宣传这类链接一般不要随便点&#xff0c;以免造成财产物品损失。 试用…

[linux]-总线,设备,驱动,dts

1. 总线BUS 在物理层面上&#xff0c;代表不同的工作时序和电平特性&#xff1a; 总线代表着同类设备需要共同遵守的工作时序&#xff0c;不同的总线对于物理电平的要求是不一样的&#xff0c;对于每个比特的电平维持宽度也是不一样&#xff0c;而总线上传递的命令也会有自己…

改进神经网络

Improve NN 文章目录 Improve NNtrain/dev/test setBias/Variancebasic recipeRegularizationLogistic RegressionNeural networkother ways optimization problemNormalizing inputsvanishing/exploding gradientsweight initializegradient checkNumerical approximationgrad…

零基础学编程从入门到精通,系统化的编程视频教程上线,中文编程开发语言工具构件之缩放控制面板构件用法

一、前言 零基础学编程从入门到精通&#xff0c;系统化的编程视频教程上线&#xff0c;中文编程开发语言工具构件之缩放控制面板构件用法 编程入门视频教程链接 https://edu.csdn.net/course/detail/39036 编程工具及实例源码文件下载可以点击最下方官网卡片——软件下载—…

【IDEA】提升效率的必备插件与设置

IDEA 必备插件 Alibaba Java Coding Guidelines&#xff1a;阿里规范扫描器&#xff0c;提升代码规范&#xff0c;避免低级错误 CamelCase&#xff1a;变量名转换&#xff08;小驼峰、大驼峰、蛇形&#xff09; CodeGlance Pro&#xff1a;代码地图概览 GenerateAllSetter&…

python调用golang中函数方法

一、原因说明&#xff1a;由于simhash方法有多种实现方式&#xff0c;现python中simhash方法与golang中的不一样&#xff0c;需要两者代码生成结果保持一致&#xff0c;故采用python中的代码调用golang编译的so文件来实现。 环境配置&#xff1a;①Windows10系统要有gcc环境&a…

4、ChatGPT 无法完成的 5 项编码任务

ChatGPT 无法完成的 5 项编码任务 这是 ChatGPT 不能做的事情的一个清单,但这并非详尽无遗。ChatGPT 可以从头开始生成相当不错的代码,但是它不能取代你的工作。 我喜欢将 ChatGPT 视为 StackOverflow 的更智能版本。非常有帮助,但不会很快取代专业人士。当 ChatGPT 问世时…

docker安装Yapi

docker安装Yapi 我试了很多次按照网上安装&#xff0c;但是看时间都是2022年之前的&#xff0c;所以我下载的mogodb都是last版本不是报错就是在报错的路上&#xff0c;后来一想那就换成2022年那些版本&#xff0c;也可能是last版本不兼容或者是比较低的版本。 我将mogodb换成…

pycharm 配置 conda 新环境

1. conda 创建新环境 本章利用pycharm将conda新建的环境载入进去 关于conda的下载参考上一章博文&#xff1a;深度学习环境配置&#xff1a;Anaconda 安装和 pip 源 首先利用conda 新建虚拟环境 这里按 y 确定 安装好如下&#xff1a;这里两行命令代表怎么激活和关闭新建的虚…

c#cad 创建-多线段(三)

运行环境 vs2022 c# cad2016 调试成功 一、程序说明 AutoCAD中创建多段线的。具体解释如下&#xff1a; 获取当前文档和数据库&#xff0c;并创建一个编辑器&#xff08;用于与用户交互&#xff09;。使用事务处理的方式&#xff0c;开始对数据库的操作。打开模型空间&…

【语音合成】中文-多情感领域-16k-多发音人

模型介绍 语音合成-中文-多情感领域-16k-多发音人 框架描述 拼接法和参数法是两种Text-To-Speech(TTS)技术路线。近年来参数TTS系统获得了广泛的应用&#xff0c;故此处仅涉及参数法。 参数TTS系统可分为两大模块&#xff1a;前端和后端。 前端包含文本正则、分词、多音字预…

米贸搜|关于Facebook广告受限:在这些情况下,Meta会限制广告主的广告能力!

如果你被限制了投放广告&#xff0c;那么你会在Facebook上收到通知。 除了审查广告之外&#xff0c;Meta还监控和调查广告主在Meta技术上的行为&#xff0c;在某些情况下&#xff0c;Meta可能会对广告主施加限制&#xff0c;限制广告主的广告能力&#xff0c;这些限制旨在帮助保…

一个Vivado仿真问题的debug

我最近在看Synopsys的MPHY仿真代码&#xff0c;想以此为参考写个能实现PWM-G1功能的MPHY&#xff0c;并应用于ProFPGA原型验证平台。我从中抽取了一部分代码&#xff0c;用Vivado自带的仿真器进行仿真&#xff0c;然后就遇到了一个莫名其妙的问题&#xff0c;谨以此文作为debug…

MybatisPlus快速入门及常见设置

目录 一、快速入门 1.1 准备数据 1.2 创建SpringBoot工程 1.3 使用MP 1.4 获取Mapper进行测试 二、常用设置 2.1 设置表映射规则 2.1.1 单独设置 2.1.2 全局设置 2.2 设置主键生成策略 2.2.1 为什么会有雪花算法&#xff1f; 2.2.2 垂直分表 2.2.3 水平分表 2.…

Netty源码系列 之 HashedWheelTimer源码

Netty优化方案 之前总结NioEventLoop以及其他内容时&#xff0c;已经总结了Netty许多优化的设计方案。 1.Selector的优化 (1) 为epoll空转问题提供了解决思路&#xff0c;虽然并没有从根本上解决epoll空转问题&#xff0c;但是使用一个计数器的方式可以减少空转所带来的性能…

windowsserver 2016 PostgreSQL9.6.3-2升级解决其安全漏洞问题

PostgreSQL 身份验证绕过漏洞(CVE-2017-7546) PostgreSQL 输入验证错误漏洞(CVE-2019-10211) PostgreSQL adminpack扩展安全漏洞(CVE-2018-1115) PostgreSQL 输入验证错误漏洞(CVE-2021-32027) PostgreSQL SQL注入漏洞(CVE-2019-10208) PostgreSQL 安全漏洞(CVE-2018-1058) …

根据MySql建表语句创建Java实体类工具

点击下载《根据MySql建表语句创建Java实体类工具》 1. 前言 在软件开发领域&#xff0c;特别是在构建企业级应用时&#xff0c;数据模型与代码模型之间的映射是至关重要的。该软件是一款基于C#开发的高效工具&#xff0c;它将这一繁琐且容易出错的过程变得简洁且快速。此工具…