leetCode二叉树的堂兄弟节点 II

题目

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

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

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

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

示例 1:

输入:root = [5,4,9,1,10,null,7]
输出:[0,0,0,7,7,null,11]
2641. 二叉树的堂兄弟节点 II

本题思路

这题思路其实是比较简单的,就是找到同层的节点,然后让非同父的节点相加即可。

这样我们就需要记录父节点,本节点的值。

于是出现了下面的代码

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {List<List<Tree>> lists=new ArrayList<>();public TreeNode replaceValueInTree(TreeNode root) {dfs(root,null,0,true);//进行两次遍历,第一次记录层数记录dfs(root,null,0,false);//第二次进行累加return root;}public void dfs(TreeNode p,TreeNode f,int l,boolean b){if(p!=null){if(b){if(lists.size()<=l)lists.add(new ArrayList<>());lists.get(l).add(new Tree(p.val,f));}else{int sum=0;for(int i=0;i<lists.get(l).size();i++){//循环遍历大量冗余循环if(f!=lists.get(l).get(i).f)sum+=lists.get(l).get(i).val;}p.val=sum;}dfs(p.left,p,l+1,b);dfs(p.right,p,l+1,b);}}
}
class Tree{int val;TreeNode f;Tree(){}Tree(int val,TreeNode f){this.val=val;this.f=f;}
}

结果不出意外的超出时间限制了,问题也很简单出现在二次遍历中的for循环当中。于是开始尝试优化,既然遍历其他同层的太过于冗余麻烦,那么我可以将同层的所有相加,而后再减去同父的节点值不就可以了。于是出现了下面的代码

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {List<Integer> lists=new ArrayList<>();public TreeNode replaceValueInTree(TreeNode root) {dfs(root,0,true,0);//同样的两次循环,不过第一次不是记录,而是统计同层的值dfs(root,0,false,0);//第二次进行减去return root;}public void dfs(TreeNode p,int l,boolean b,int f){if(p!=null){if(b){//累加if(lists.size()<=l)lists.add(0);lists.set(l,lists.get(l)+p.val);}else{//减去p.val=lists.get(l)-f-p.val;}int lp=p.left==null?0:p.left.val;//因为引用修改的关系,所以需要提前复制dfs(p.left,l+1,b,p.right==null?0:p.right.val);dfs(p.right,l+1,b,lp);}}
}

最后成功通过,但其实完全可以使用bfs来进行优化编写,将会更加的省空间。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第29天 | 491.递增子序列 ,46.全排列 ,47.全排列 II

回溯章节理论基础&#xff1a; https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 491.递增子序列 题目链接&#xff1a;https://leetcode.cn/problems/non-decreasing-subsequences/ 思路&#xff1a; 本题求自…

关于域名递归解析服务的问题

域名递归解析服务是互联网基础设施的重要组成部分&#xff0c;它允许用户通过域名来访问网站或应用程序。然而&#xff0c;在某些情况下&#xff0c;域名递归解析服务可能会出现问题&#xff0c;导致用户无法正常访问网站或应用程序。本文将探讨域名递归解析服务可能面临的问题…

一文带你搞定搭建自己的组件库Rollup

一文带你搞定搭建自己的组件库(rollup.js) 目前Vue和React都是采用rollup.js进行打包,我们在公司开发的时候也可以用rollup搭建一个自己的组件库放到你的项目中,简化项目的结构项目性能。 接下来我将带你使用rollup从0——1搭建一个在vue中使用的组件库 开发前准备 我的开发…

提示由于找不到msvcp120dll无法继续执行此代码怎么办

在计算机系统中&#xff0c;MSVCP120.dll是一个至关重要的动态链接库文件&#xff0c;它是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于Windows的应用程序运行至关重要。当系统提示“msvcp120dll丢失”时&#xff0c;意味着该文件可能由于误删…

c++设计模式之装饰器模式

作用 为现有类增加功能 案例说明 class Car { public:virtual void show()0; };class Bmw:public Car { public:void show(){cout<<"宝马汽车>>"<<endl;} };class Audi:public Car { public:void show(){cout<<"奥迪汽车>>&q…

【Unity】QFramework通用背包系统优化:使用Odin优化编辑器

前言 在学习凉鞋老师的课程《QFramework系统设计&#xff1a;通用背包系统》第四章时&#xff0c;笔者使用了Odin插件&#xff0c;对Item和ItemDatabase的SO文件进行了一些优化&#xff0c;使物品页面更加紧凑、更易拓展。 核心逻辑和功能没有改动&#xff0c;整体代码量减少…

并发容器(Map、List、Set)实战及其原理

目录 JUC包下的并发容器 CopyOnWriteArrayList 应用场景 CopyOnWriteArrayList使用 CopyOnWriteArrayList原理 CopyOnWriteArrayList 的缺陷 扩展知识&#xff1a;迭代器的 fail-fast 与 fail-safe 机制 ConcurrentHashMap 应用场景 ConcurrentHashMap使用 数…

IT行业针对大数据的安全文件传输的重要性

在数字化浪潮的推动下&#xff0c;数据已成为现代社会的宝贵资源。特别是大数据&#xff0c;以其海量、多样化、高速增长和低价值密度的特性&#xff0c;对信息技术&#xff08;IT&#xff09;行业产生了深远影响。大数据的应用不仅推动了云计算、物联网和人工智能等领域的发展…

算法——前缀和算法

1. 什么是前缀和算法 前缀和算法&#xff08;Prefix Sum&#xff09;是一种用于快速计算数组元素之和的技术。它通过预先计算数组中每个位置前所有元素的累加和&#xff0c;将这些部分和存储在一个新的数组中&#xff0c;从而在需要计算某个区间的和时&#xff0c;可以通过简单…

Backtrader 文档学习- Sizers

Backtrader 文档学习- Sizers 1.概述 智能仓位 Strategy提供了交易方法&#xff0c;即&#xff1a;buy&#xff0c;sell和close。看一下buy的定义&#xff1a; def buy(self, dataNone,sizeNone, priceNone, plimitNone,exectypeNone, validNone, tradeid0, **kwargs):注意&…

SpringBoot整合Knife4j接口文档生成工具

一个好的项目&#xff0c;接口文档是非常重要的&#xff0c;除了能帮助前端和后端开发人员更快地协作完成开发任务&#xff0c;接口文档还能用来生成资源权限&#xff0c;对权限访问控制的实现有很大的帮助。 这篇文章介绍一下企业中常用的接口文档工具Knife4j&#xff08;基于…

每日一题——LeetCode1389.按既定顺序创建目标数组

方法一 splice 使用splice函数就可以在数组的指定索引位置添加元素 var createTargetArray function(nums, index) {let res[]for(let i0;i<nums.length;i){res.splice(index[i],0,nums[i])}return res }; 消耗时间和内存情况&#xff1a; 方法二 模拟 如果res[index[…