牛客NC195 二叉树的直径【simple DFS C++ / Java /Go/ PHP】

题目

在这里插入图片描述
在这里插入图片描述
题目链接:
https://www.nowcoder.com/practice/15f977cedc5a4ffa8f03a3433d18650d

思路

最长路径有两种情况:
1.最长条路径经过根节点,那么只需要找出根节点的左右两棵子树的最大深度然后相加即可。
2.最长路径没有经过根节点,那么只需要找出根节点的左子树或者根节点的右子树作为根的最长路径度即可。递归调用,自底向上查找子树的深度,如果某一个左子树与右子树深度之和大于当前纪录的直径,那么替换为当前直径,递归完成之后即可找出直径。

参考答案C++

/*** struct TreeNode {*  int val;*  struct TreeNode *left;*  struct TreeNode *right;*  TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* };*/
class Solution {public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param root TreeNode类* @return int整型*/int diameterOfBinaryTree(TreeNode* root) {/*最长路径有两种情况:1.最长条路径经过根节点,那么只需要找出根节点的左右两棵子树的最大深度然后相加即可。2.最长路径没有经过根节点,那么只需要找出根节点的左子树或者根节点的右子树作为根的最长路径度即可。递归调用,自底向上查找子树的深度,如果某一个左子树与右子树深度之和大于当前纪录的直径,那么替换为当前直径,递归完成之后即可找出直径。*/if (root == nullptr)return 0;vector<TreeNode> q;q.push_back(*root);int ans = 0;while (q.size() > 0 ) {int size = q.size();vector<TreeNode> qbak;for (int i = 0; i < size; i++) {TreeNode pop = q[i];int h1 = height(pop.left);int h2 = height(pop.right);if ( ans < h1 + h2) {ans = h1 + h2;}if (pop.left != nullptr) {qbak.push_back(*pop.left);}if (pop.right != nullptr) {qbak.push_back(*pop.right);}}q = qbak;}return ans;}int height(TreeNode* node) {if (node == nullptr) return 0;int h1 = height(node->left);int h2 = height(node->right);if (h1 > h2) {return h1 + 1;}return h2 + 1;}
};

参考答案Java

import java.util.*;/** public class TreeNode {*   int val = 0;*   TreeNode left = null;*   TreeNode right = null;*   public TreeNode(int val) {*     this.val = val;*   }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param root TreeNode类* @return int整型*/public int diameterOfBinaryTree (TreeNode root) {/*最长路径有两种情况:1.最长条路径经过根节点,那么只需要找出根节点的左右两棵子树的最大深度然后相加即可。2.最长路径没有经过根节点,那么只需要找出根节点的左子树或者根节点的右子树作为根的最长路径度即可。递归调用,自底向上查找子树的深度,如果某一个左子树与右子树深度之和大于当前纪录的直径,那么替换为当前直径,递归完成之后即可找出直径。*/if (root == null) return 0;Queue<TreeNode> q = new LinkedList<>();q.add(root);int max = 0;while (!q.isEmpty()) {TreeNode pop = q.poll();int h1 = heigt(pop.left); //左树高度int h2 = heigt(pop.right); //右树高度if (max < h1 + h2) {max = h1 + h2;}if (pop.left != null) {q.add(pop.left);}if (pop.right != null) {q.add(pop.right);}}return max;}public int heigt(TreeNode node) {if (node == null) return 0;int h1 = heigt(node.left);int h2 = heigt(node.right);return Math.max(h1, h2) + 1;}
}

参考答案Go

package mainimport . "nc_tools"/** type TreeNode struct {*   Val int*   Left *TreeNode*   Right *TreeNode* }*//*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可*** @param root TreeNode类* @return int整型*/
func diameterOfBinaryTree(root *TreeNode) int {/*最长路径有两种情况:1.最长条路径经过根节点,那么只需要找出根节点的左右两棵子树的最大深度然后相加即可。2.最长路径没有经过根节点,那么只需要找出根节点的左子树或者根节点的右子树作为根的最长路径度即可。递归调用,自底向上查找子树的深度,如果某一个左子树与右子树深度之和大于当前纪录的直径,那么替换为当前直径,递归完成之后即可找出直径。*/if root == nil {return 0}q := []*TreeNode{}q = append(q, root)ans := 0for len(q) > 0 {size := len(q)qbak := []*TreeNode{}for i := 0; i < size; i++ {pop := q[i]h1 := height(pop.Left)h2 := height(pop.Right)if ans < h1+h2 {ans = h1 + h2}if pop.Left != nil {qbak = append(qbak, pop.Left)}if pop.Right != nil {qbak = append(qbak, pop.Right)}}q = qbak}return ans
}func height(node *TreeNode) int {if node == nil {return 0}h1 := height(node.Left)h2 := height(node.Right)if h1 > h2 {return h1 + 1}return h2 + 1
}

参考答案PHP

<?php/*class TreeNode{var $val;var $left = NULL;var $right = NULL;function __construct($val){$this->val = $val;}
}*//*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param root TreeNode类 * @return int整型*/
function diameterOfBinaryTree( $root )
{/*最长路径有两种情况:1.最长条路径经过根节点,那么只需要找出根节点的左右两棵子树的最大深度然后相加即可。2.最长路径没有经过根节点,那么只需要找出根节点的左子树或者根节点的右子树作为根的最长路径度即可。递归调用,自底向上查找子树的深度,如果某一个左子树与右子树深度之和大于当前纪录的直径,那么替换为当前直径,递归完成之后即可找出直径。*/if($root ==null){return 0;}$q = [$root];$max = 0;while (count($q) >0){$size =count($q);$qbak = [];for($i=0;$i<$size;$i++){$pop = $q[$i];$h1 = height($pop->left);$h2 = height($pop->right);if($max < $h1+$h2){$max = $h1+$h2;}if($pop->left!=null){$qbak[count($qbak)] = $pop->left;}if($pop->right!=null){$qbak[count($qbak)] = $pop->right;}}$q =$qbak;}return $max;
}function height($node){if($node ==null) return 0;$h1 = height($node->left);$h2 = height($node->right);if($h1 >$h2){return $h1+1;}return $h2+1;
}

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

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

相关文章

js some对比forEach

some&#xff1a;return true可以停止循环 forEach&#xff1a;return true无法停止循环 <!DOCTYPE html> <html ng-app"my_app"><head><script type"text/javascript">const array [10, 20, 30];const targetValue 10;// 检测…

Vue3的监听属性watch和计算属性computed

监听属性watch 计算属性computed 一、监听属性watch watch 的第一个参数可以是不同形式的“数据源&#xff0c;watch 可以监听以下几种数据&#xff1a; 一个 ref (包括计算属性)、 一个响应式对象、 一个 getter 函数、 或多个数据源组成的数组 watch 的参数:监视的回调&…

企业数字化转型

企业数字化更多是业务数字化&#xff0c;是“信息化”的更新升级&#xff0c;和信息化有较大差别。 企业信息化专注于企业信息的记录&#xff0c;“无纸化办公”是其明显特征。企业信息化不改造业务&#xff0c;只是业务的计算机方式实现&#xff0c;不对企业内部流程或组织做…

Linux驱动开发——(四)内核定时器

一、内核的时间管理 1.1 节拍率 Linux内核中有大量的函数需要时间管理&#xff0c;比如周期性的调度程序、延时程序等等&#xff0c;对于驱动编写者来说最常用的是定时器。 硬件定时器提供时钟源&#xff0c;时钟源的频率可以设置&#xff0c;设置好以后就周期性的产生定时中…

C#:用 BigInteger 计算 斐波那契数列

using System.Numerics; 计算 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;不受长整型位数限制。 编写 fibonacci.cs 如下 // C# program for Fibonacci Series // using Dynamic Programming using System; using System.Numerics;class fibona…

【C++语言】字符串String练习题

题目连接&#xff1a; 仅仅反转字母 1.仅仅反转字母 给你一个字符串 s &#xff0c;根据下述规则反转字符串&#xff1a; 所有非英文字母保留在原有位置。所有英文字母&#xff08;小写或大写&#xff09;位置反转。 返回反转后的 s 。 示例 1&#xff1a; 输入&#xff1a;s …

Linux学习(补充部分)

关键字 goto关键字 goto 是一个在编程语言中用于控制流的关键字,它允许程序跳转到代码中的标记处。尽管在一些编程规范中被视为不良实践,但在某些情况下,goto 仍然可以是一种有用的工具。 在 C、C++、Python、以及一些其他编程语言中,goto 的基本语法如下: goto label;…

STM32单片机C语言模块化编程实战:按键控制LED灯并串口打印详解与示例

一、开发环境 硬件&#xff1a;正点原子探索者 V3 STM32F407 开发板 单片机&#xff1a;STM32F407ZGT6 Keil版本&#xff1a;5.32 STM32CubeMX版本&#xff1a;6.9.2 STM32Cube MCU Packges版本&#xff1a;STM32F4 V1.27.1 虽然这里演示的是STM32F407&#xff0c;但是ST…

INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN

联表查询是指在数据库中同时查询多个表&#xff0c;并通过它们之间的关联条件将结果合并在一起。这通常通过 SQL 中的 JOIN 操作来实现。常见的 JOIN 类型包括 INNER JOIN、LEFT JOIN、RIGHT JOIN 和 FULL JOIN。 让我们通过一个示例来说明联表查询的基本用法。假设有两个表&a…

ros的master和apollo的cyber的异同

1、前言 ROS (Robot Operating System) 和 Apollo Cyber RT 是两种不同的机器人操作系统框架&#xff0c;各自设计以满足不同场景下尤其是自动驾驶领域的特定需求。虽然它们在设计理念和核心功能上有相似之处&#xff0c;如提供节点&#xff08;Nodes&#xff09;、消息传递机…

书生·浦语大模型第二期实战营第三节-茴香豆:搭建你的 RAG 智能助理 笔记和作业

来源&#xff1a; 视频教程&#xff1a;茴香豆&#xff1a;搭建你的 RAG 智能助理 文字教程&#xff1a;茴香豆&#xff1a;搭建你的 RAG 智能助理 作业来源&#xff1a;第三课作业 茴香豆web链接&#xff1a;茴香豆web-零编程接入飞书微信&#xff08;更新了高精度 LLM&am…

使用R语言生成频数分布表

概要 使用R语言生成频数分布表 在R语言中&#xff0c;可以使用freq()函数来生成频数分布表。首先&#xff0c;将需要分组的数据存储在一个向量中。然后&#xff0c;使用freq()函数将这个向量作为参数输入&#xff0c;即可生成频数分布表。以下是一个示例&#xff1a; 示例 …

代码随想录算法训练营day7 | 454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和

454.四数相加II 有下面几种思路&#xff1a; 暴力解法&#xff0c;四重循环一个哈希表三重循环两重循环生成一个哈希表两重循环 使用两重循环&#xff1a; class Solution:def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]…

内插和抽取

抽取&#xff1a; 频域表达式的关系&#xff1a; 1、角频率扩大M倍 2、移动2pi、22pi…&#xff08;n-1&#xff09; 2pi 3、相加 4、幅度变为1/M 内插&#xff1a; 加入低通滤波&#xff0c;减小混叠&#xff0c;但是由于截短&#xff0c;也会造成误差&#xff0c;但是…

setTimeout运行机制

当调用 setTimeout 函数时&#xff0c;它用于安排在一定延迟后执行的代码块。它的运行机制如下&#xff1a; 调度任务&#xff1a; 当调用 setTimeout 时&#xff0c;JavaScript 引擎会创建一个定时器&#xff0c;并将指定的代码块&#xff08;回调函数&#xff09;添加到一个称…

贪吃蛇完整代码

贪吃蛇代码 Snake.h //Snake.h #include<windows.h> #include<stdbool.h> #include<stdlib.h> #include<stdio.h> #include<time.h>#define POS_X 24 #define POS_Y 5#define WALL L□ #define BODY L● #define FOOD L★ //类型的声明 // //…

linux复习提纲

后台运行 &&#xff1a;命令行尾输入&#xff0c;命令执行后台运行fg % 作业号&#xff1a;作业前台执行bg % 作业号&#xff1a;作业后台执行 用户权限 主user&#xff08;u&#xff09;-同一组的&#xff08;g&#xff09;-其他&#xff08;o&#xff09; rwx&#xf…

【YOLOv8改进[检测头Head]】YOLOv8的“新头”之动态头(DynamicHead)

目录 一 DynamicHead 二 YOLOv8的“新头”之动态头 1 总体修改 2 配置文件 3 训练 其他 一 DynamicHead 官方论文地址&#xff1a;https://arxiv.org/pdf/2106.08322.pdf 官方代码地址&#xff1a;GitCode - 开发者的代码家园 在计算机视觉应用中&#xff0c;目标检测…

软件著作权登记材料

1、计算机软件著作权登记申请表 2、申请者身份证明 (1)著作权人为企业法人的&#xff1a; 提交有效的企业法人营业执照或事业单位法人证书副本复印件&#xff0c;并需加盖单位公章; (2)著作权人为自然人的&#xff1a; ?提交有效的自然人身份证复印件(正反面复印)。提交《非职…

第四百七十五回

文章目录 1. 概念介绍2. 功能与用法2.1 主要功能2.2 使用方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"四个bublue包对比与总结"相关的内容&#xff0c;本章回中将介绍Get包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中将介…