687 最长同值路径——Leetcode 天天刷(2022.9.2)【DFS】

news/2024/5/3 23:19:33/文章来源:https://blog.csdn.net/weixin_54891898/article/details/126671521

687 最长同值路径——Leetcode 天天刷(2022.9.2)【DFS】

文章目录

  • 687 最长同值路径——Leetcode 天天刷(2022.9.2)【DFS】
    • 前言
    • 题目描述
      • 示例
      • 提示信息
    • 本地调试运行
      • 输入格式
      • 输出格式
      • 输入样例
      • 输出样例
      • 层次遍历构造二叉树
    • 解法——DFS
      • 细节
      • 算法分析+解题效率
      • Code(C++)

前言

今天的题目emmm,怎么说呢,其实算法上比较简单,但是细节还是比较多的,也可以说是自己考虑的不够足够。

算法上采用的DFS,即深度优先搜索。

题目描述

题目传送门

简述一下:就是给你一个二叉树,需要返回 最长的 同值路径 的长度,就是路径上的每个节点都同值。

路径的长度用 边数 来表示。

示例

输入:root = [5,4,5,1,1,5]
输出:2
输入:root = [1,4,5,4,4,5]
输出:2

提示信息

  • 树的节点数的范围是 [0, 104]
  • -1000 <= Node.val <= 1000
  • 树的深度将不超过 1000

本地调试运行

说实话,树之类的构造,尤其是指针类型的树构建还是比较麻烦的,从样例来看就是输入用BFS顺序或者说是 层次遍历 的顺序来构建二叉树。

输入格式

我们还是可以假定多组输入,每组第一行输入整数n,然后第二行输入n个字符串,字符串直接用 空格 隔开,其中 null 表示空节点,数字 就是表示节点值。

输出格式

每行输出一个整数,表示最大同值路径长度。

输入样例

6
5 4 5 1 1 56
1 4 5 4 4 58
1 null 1 1 1 1 1 1

输出样例

2
2
4

层次遍历构造二叉树

其实就是创建二叉树的一种方式,大家如果看不懂最后的代码的构建二叉树的部分,可以看看下面的这篇的blog:

blog传送门

解法——DFS

首先,我们对于 节点路径长度,考虑的是以当前节点值作为数值的同值路径长度。因此,我们可以先递归计算以左右子节点的节点路径长度,然后根据左右子节点值和当前节点值的是否相同来计算当前节点的节点路径长度,同时需要返回当前的最大单侧节点路径长度

细节

  1. 首先是用边数来表示长度,所以对于长度的最小值为0,空节点返回-1。
  2. 如果子节点和当前节点值相同,我们可以将子节点的节点路径长度 + 1, 1表示当前当前节点和子节点的边。
  3. 返回路径长度的时候,如果是当前节点路径长度是两侧的,返回需要只返回单侧长度较大的。

算法分析+解题效率

时间复杂度O(n)O(n)O(n),n为节点数量。

空间复杂度O(n)O(n)O(n), DFS递归n层。

在这里插入图片描述

还行。

Code(C++)

#include<iostream>
#include<string>
#include<vector>
#include<queue>
#include<sstream>
using namespace std;// 定义二叉树节点
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 BinaryTree
{
public:TreeNode* root;		// 根节点/// <summary>/// BFS——根据数组构建二叉树/// 数组中节点的顺序表示的就是BFS的顺序/// 所以使用BFS 完成搜索/// </summary>au/// <param name="nodes"></param>BinaryTree(vector<string> nodes){// 下标索引int i = 0;// 数组尺寸int n = nodes.size();// 先判断根节点是否是空if (nodes[0] == "null" && n == 1){root = nullptr;return;}// 非空则新建根节点stringstream ss;ss << nodes[0];int val;ss >> val;root = new TreeNode(val);i++;// 节点对列queue<TreeNode*> que;// 先将根结点入队que.push(root);// 当对列不空且未遍历完时while (!que.empty() && i < n){// 获取节点并出队TreeNode* node = que.front();que.pop();// 然后给左右指针for (int j = 1; j <= 2 && i < n; ++j, ++i){// 若空则置空if (nodes[i] == "null" && j == 1){node->left == nullptr;}else if (nodes[i] == "null" && j == 2){node->right = nullptr;}// 非空则生成节点并入队else if (j == 1){node->left = new TreeNode(stoi(nodes[i]));que.push(node->left);}else{node->right = new TreeNode(stoi(nodes[i]));que.push(node->right);}}}}/// <summary>/// 展示树的结构/// 为了能够清晰展示,还是使用BFS/// </summary>void display(){// 若根节点为空if (root == nullptr){return;}// 非空入队queue<TreeNode*> que;que.push(root);// 每一层节点的数量,包括空节点int t = 0, num = 1;while (!que.empty()){TreeNode* node = que.front();que.pop();cout << node->val << " ";num--;for (int i = 0; i < 2; ++i){TreeNode* child;if (i == 0){child = node->left;}else{child = node->right;}if (child != nullptr){que.push(child);t++;}}// 当num = 0 时,说明当层遍历完,需要换行,进入下一层if (num == 0){cout << endl;num = t;t = 0;}}}
};class Solution
{
private:int len;
public:// DFS// 先计算出子树中以子节点的数值为路径的长度// 然后根据子节点数值和当前节点是否相同,若相同则加上对应长度// 最后每次递归和答案长度比较动态更新int longestUnivaluePath(TreeNode* root){len = 0;dfs(root);return len;}int dfs(TreeNode* node){// 空节点,返回-1if (!node){return -1;}int l1, l2;					// 分别以左右子节点值为路径的长度int len0 = 0;				// 以当前节点值为路径的长度l1 = dfs(node->left);		// 计算左子树l2 = dfs(node->right);		// 计算右子树int len1 = 0, len2 = 0;		// 计算以当前节点的左右路径// 如果左节点同值,计算当前路径if (node->left && node->left->val == node->val){len0 += l1 + 1;len1 = l1 + 1;}// 同理if (node->right && node->right->val == node->val){len0 += l2 + 1;len2 = l2 + 1;}// 动态更新最大路径len = max(len, len0);return max(len1, len2);		// 返回单路径的最大值}
};int main(int agrc, char** argv)
{int n;Solution * sol = new Solution();while (~scanf("%d", &n)){vector<string> nodes(n);for (int i = 0; i < n; ++i){cin >> nodes[i];}BinaryTree* bt = new BinaryTree(nodes);printf("%d\n", sol->longestUnivaluePath(bt->root));delete bt;}delete sol;return 0;
}

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

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

相关文章

新店速递丨白玉兰(商务)酒店赣榆吾悦广场店 正式上线

第242家 白玉兰酒店再下连云港 2022年9月&#xff0c;锦江酒店&#xff08;中国区&#xff09;旗下优选服务酒店品牌“白玉兰酒店”连云港再添一员&#xff0c;迎来门店——白玉兰&#xff08;商务&#xff09;酒店赣榆吾悦广场酒店正式上线。这也是全国第242家开业的白玉兰酒…

Git做版本管理及CHANGELOG

规范化的提交信息除了能很好描述项目的修改&#xff0c;还有一个很好的作用就是能根据提交记录来生成CHANGELOG.MD和自动生成版本号等功能。 standard-version 一个用于生成CHANGELOG.md和进行SemVer(语义化版本号)发版的命令行工具 主要功能&#xff1a; 自动修改最新版本…

6-2 多项式求值——15分

本题要求实现一个函数,计算阶数为n,系数为a[0] … a[n]的多项式(上图) 在x点的值。 函数接口定义: double f( int n, double a[], double x );其中n是多项式的阶数,a[]中存储系数,x是给定点。函数须返回多项式f(x)的值。 裁判测试程序样例: #include <stdio.h>#def…

Docker - 容器的网络模式

目录 一、bridge模式 查看容器的有哪几种网络类型 二、host模式 三、none模式 四、container模式 五、overlay模式 创建一个桥接类型的网卡 使用刚才创建的网卡来创建容器 查看刚才使用网卡创建的容器的ip地址 我们指定网卡创建的容器IP地址是 &#xff1a;172.18.0.…

计算机网络——网络协议

目录 网络协议 网络协议的三要素 协议的分层模型 计算机网络层次结构的好处 计算机网络的体系结构 OSI与TCP/IP的体系结构的比较 网络协议 1、计算机网络中的数据交换必须遵守事先约定好的规则。 2、这些规则明确规定了所交换的数据的格式和时序&#xff0c;以及在发送或…

SpringBoot 整合 RabbitMQ 实现消息回调、手动确认 (二) 有图 有源码

创建时间 2022年8月29日 标签&#xff1a;Java、SpringBoot、RabbitMQ、队列 注释&#xff1a;新建SpringBoot项目实操RabbitMQ实现消息回调、手动确认 来源&#xff1a;CSDN博主&#xff1a;小目标青年 文章目录SpringBoot 整合 RabbitMQ 回调确认模式生产者推送消息回调1、消…

3天精通Postman---动态参数amp;断言amp;CSV数据驱动amp;Mock Server

DAY2课题&#xff1a;Postman接口关联&动态参数&断言&CSV数据驱动目录 一、接口关联&#xff0c;接口依赖&#xff0c;多接口串联&#xff0c;组合API 二、Postman的动态参数&#xff08;随机数&#xff09; 三、Postman的环境变量和全局变量 四、Postman断言 五、…

极端气候肆虐催化,碳中和带出了一个“再生时代”

江南一带的高温结束了&#xff0c;今年这场轰轰烈烈的高温&#xff0c;也画上了最后的句号。各地骤降的温度让人仿佛忘却了“热到爆表”的经历&#xff0c;但过去已经成为历史&#xff0c;历史充满痕迹。 格陵兰岛冰盖加速融化、欧洲莱茵河部分河段干涸、长江流域汛期反枯、重…

Cyclopropene-PEG-MAL Maleimide|环丙烯-聚乙二醇-马来酰亚胺

描述&#xff1a;环丙烯有机化合物。环丙烯是由三个碳原子构成的环烯烃&#xff0c;分子式为C3H4 &#xff0c;由于具有张力&#xff0c;环丙烯具有一些和其他环烯烃不同的性质。 理化性质 环丙烯在常温常压下为无色气体&#xff0c;沸点-36.15 &#xff0c;折射率1.489 。 环…

Git的安装与使用

1、Git的下载 2、git的安装 点击安装软件&#xff0c;一路安装到底&#xff0c;无需做任何选择 ...... 此处省略中间安装步骤 ...... 3、检验是否安装成功 在桌面右键&#xff0c;如果出现此图&#xff0c;表示安装成功 4、配置git 为了方便git客户端操作远程仓储方便&#…

Redis集群搭建(单机集群)

Redis入门篇https://blog.csdn.net/tongxin_tongmeng/article/details/126620333集群配置文件&#xff08;单机集群&#xff09; 1.复制/home/redis/redis-7.0.4/redis.conf到/home/redis/workspace/cluster_one cp /home/redis/redis-7.0.4/redis.conf /home/redis/workspace/…

私有化部署的知识管理平台对企业有什么意义?

随着企业的发展扩大&#xff0c;企业内部沉淀的知识也越来越多。过去很多企业都会将知识存储到云上&#xff0c;云部署模式虽然给企业带来了极大的便利&#xff0c;但在一些性能及数据安全上会存在一定的弊端&#xff0c;隐藏不少的企业会选择将数据存储在本地。下面我们就从企…

数字机器人如何更好的助力智慧政务?这里或许有你想要的答案

“十四五”规划和2035年远景目标纲要中明确提出&#xff0c;迎接数字时代&#xff0c;加快建设数字经济、数字社会、数字政府&#xff0c;以数字化转型整体驱动生产方式、生活方式和治理方式变革。 国务院于6月23日印发的《关于加强数字政府建设的指导意见》&#xff0c; 再一…

22年国家gongwuyuan考试申论题(副省级)

2022年国家公务员考试申论题&#xff08;副省级&#xff09;的问题一&#xff0c;它的题目是&#xff1a;根据“给定资料1”&#xff0c;请你谈谈B公司的案例为企业科技创新提供了哪些启示&#xff1b;要求&#xff1a;分析全面&#xff0c;条理清晰&#xff0c;不超过200字。 …

一个SpringBoot问题就干趴下了?我却凭着这份PDF文档吊打面试官(Spring Boot知识点+详解)

随着 Spring Boot 使用越来越广泛&#xff0c;Spring Boot 已经成为 Java 程序员面试的知识点&#xff0c;很多同学对 Spring Boot 理解不是那么深刻&#xff0c;经常就会被几个连环追问就给干趴下了&#xff01; 给大家整理了 Spring Boot 的35个常见知识点、21道面试必刷题、…

Docker基础-3.本地镜像发布与容器数据卷

我们在上一章中生成了自己的镜像&#xff1a;myubuntu&#xff0c;这章分别将它发布到阿里云和私有仓库 docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE myubuntu 1.0 938b4fc0baf5 20 minutes ago 179MB一、本地镜像发布到阿里云…

视频融合平台EasyCVR视频广场页脚优化为瀑布流式的实现方式

EasyCVR基于云边端一体化架构&#xff0c;兼容性高、拓展性强&#xff0c;可支持多类型设备、多协议方式接入&#xff0c;将复杂多变的底层资源统一管理起来&#xff0c;实现视频资源的统一汇聚与管理、鉴权分发、服务器集群、智能分析、数据共享、集成与调用等视频能力服务。 …

如何使用Postman快速简单的调用快递物流平台快递鸟API接口

前沿 快递鸟是一家聚合类的第三方快递物流平台&#xff0c;目前该平台提供的产品主要以API为主。由于API不能直观的看到产品效果&#xff0c;需要进行API对接联调成功后才能真实的看到产品的实际效果。但是如果一上来就写代码进行对接&#xff0c;耗费的时间长不说&#xff0c…

川渝智慧高速第 4 部分:车路协同系统数据交换

1 范围 本文件规定了智慧高速公路车路协同系统数据交换的架构和内容。 本文件适用于成渝地区双城经济圈智慧高速公路的新建、改&#xff08;扩&#xff09;建工程&#xff0c;以及高速公路既有设施 智慧化提升改造。 2 规范性引用文件 下列文件中的内容通过文中的规范性引用…

自动化情侣微信早安信息定时推送

文章目录一、效果展示二、配置config.txt&#xff08;重点&#xff09;2.1 填写appID和appsecret2.1 创建测试模板填写template_id2.4 填写user2.5 填写weather_key2.6 填写剩下其他框选内容即可三、运行软件3.1 选择config.txt文件并设定时间3.2 运行软件3.3 效果展示一、效果…