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

server/2024/9/22 15:48:21/

题目

在这里插入图片描述
在这里插入图片描述
题目链接:
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.ppmy.cn/server/11399.html

相关文章

破解生产瓶颈,提升时效性——蓝鹏测控推进效率革新

在日益激烈的市场竞争中&#xff0c;蓝鹏公司近日宣布采取一系列措施&#xff0c;旨在解决生产过程中的关键短板问题&#xff0c;特别是设计定稿延迟、原料采购不及时等问题&#xff0c;以确保生产部门能够按时完成订单&#xff0c;提高整体运营效率。 蓝鹏公司位于经济发展活…

大厂Redis高频面试题及参考答案(持续更新)

描述一下Redis的基本工作原理。 Redis(Remote Dictionary Server)是一个开源的,基于内存的高性能键值对数据库。它的基本工作原理可以分为以下几个方面: 内存存储:Redis将所有数据存储在内存中,这使得数据的读写速度非常快,可以支持每秒数十万次的读写操作。 数据持久化…

【后端】node.js安装与配置教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装node.js二、验证安装三、配置 npm四、开发环境配置五、总结 前言 随着开发语言及人工智能工具的普及&#xff0c;使得越来越多的人会主动学习使用一些…

C语言指针+-整数、指针-指针、指针关系运算、指针和数组、二级指针、指针数组

文章目录 前言一、指针 - 整数二、指针 - 指针三、指针的关系运算四、指针和数组五、二级指针六、指针数组指针数组可以将几个一维数组模拟成二维数组 总结 前言 C语言指针整数、指针-指针、指针关系运算、指针和数组、二级指针、指针数组等介绍&#xff0c;还包括指针数组将几…

【静态分析】软件分析课程实验-前置准备

课程&#xff1a;南京大学的《软件分析》课程 平台&#xff1a;Tai-e&#xff08;太阿&#xff09;实验作业平台 1. 实验概述 Tai-e 是一个分析 Java 程序的静态程序分析框架&#xff0c;相比于已有的知名静态程序分析框架&#xff08;如 Soot、Wala 等&#xff09;&#xf…

09_FreeRTOS任务通知

任务通知 任务通知常用任务通知API函数 任务通知 FreeRTOS 从 V8.2.0 版本开始提供任务通知这个功能&#xff0c;每个任务都有一个 32 位的通知值&#xff0c;在大多数情况下&#xff0c;任务通知可以替代二值信号量、计数信号量、事件组&#xff0c;也可以替代长度为 1 的队列…

代码随想录算法训练营第四十六天|139.单词拆分、背包问题总结

代码随想录算法训练营第四十六天|139.单词拆分、背包问题总结 139.单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 **注意&#xff1a;**不要求字典中出现的单词全部都使用&#xff0c;并且…

【单元测试】Junit 4--junit4 内置Rule

1.0 Rules ​ Rules允许非常灵活地添加或重新定义一个测试类中每个测试方法的行为。测试人员可以重复使用或扩展下面提供的Rules之一&#xff0c;或编写自己的Rules。 1.1 TestName ​ TestName Rule使当前的测试名称在测试方法中可用。用于在测试执行过程中获取测试方法名称…