坚持刷题 | 二叉树的直径

文章目录

  • 题目
  • 考察点
  • 代码实现
  • 实现总结
  • 方便用迭代的方式实现吗?
    • 迭代实现
    • 迭代实现总结

Hello,大家好,我是阿月。坚持话题,老年痴呆追不上我,今天还有时间,那就再来一题吧:二叉树的直径

题目

543.二叉树的直径
在这里插入图片描述

考察点

  • 理解二叉树的结构和直径的定义。
  • 理解直径的定义,即任意两个节点之间最长路径的长度。
  • 能够利用数据结构合理的设计出递归算法并实现。
  • 算法的正确性和高效性是非常重要的考察点。

代码实现

class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }
}public class BinaryTreeDiameter {int diameter;public int diameterOfBinaryTree(TreeNode root) {diameter = 0;depth(root);return diameter;}private int depth(TreeNode node) {if (node == null) return 0;int leftDepth = depth(node.left);int rightDepth = depth(node.right);diameter = Math.max(diameter, leftDepth + rightDepth);return Math.max(leftDepth, rightDepth) + 1;}public static void main(String[] args) {// 构建测试用的二叉树TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);BinaryTreeDiameter solution = new BinaryTreeDiameter();System.out.println("Diameter of the binary tree: " + solution.diameterOfBinaryTree(root));}
}

实现总结

  • 方法diameterOfBinaryTree,用来计算二叉树的直径。
  • depth方法被用来计算节点的深度,并通过计算左右子树的深度,更新直径的值。
  • 最后,在main方法中构建一个测试用的二叉树,并输出其直径。
  • 这个实现实际上借鉴了坚持刷题|二叉树的最大深度的思想。
    • 在计算二叉树的直径时,需要获取每个节点的左子树和右子树的深度,并结合起来计算直径。
    • 在计算二叉树的最大深度时,也是递归地计算左子树和右子树的深度,然后取最大值并加上根节点的深度来得到整棵树的深度。
  • 时间复杂度:O(N),其中 N是二叉树中节点的数量。
    • 在深度优先搜索(DFS)的过程中,遍历了二叉树的每个节点一次。
    • 对于每个节点,都需要计算其左子树和右子树的深度,这个操作的时间复杂度是 O(1) ,因为每个节点只需要常数时间来计算。
    • 因此,总的时间复杂度是所有节点的数量,即 O(N)。

方便用迭代的方式实现吗?

当涉及到计算二叉树直径时,通常更适合使用递归而不是迭代。尽管可以通过一些技巧来使用迭代,但通常会更加复杂且不直观。这是因为直径的计算涉及到节点的深度,而深度优先搜索(DFS)的自然实现是通过递归来完成的。

迭代实现

import java.util.Stack;class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }
}public class BinaryTreeDiameterIterative {public int diameterOfBinaryTree(TreeNode root) {if (root == null) return 0;int diameter = 0;Stack<TreeNode> stack = new Stack<>();stack.push(root);while (!stack.isEmpty()) {TreeNode node = stack.pop();int leftDepth = maxDepth(node.left);int rightDepth = maxDepth(node.right);diameter = Math.max(diameter, leftDepth + rightDepth);if (node.left != null) stack.push(node.left);if (node.right != null) stack.push(node.right);}return diameter;}private int maxDepth(TreeNode node) {if (node == null) return 0;int leftDepth = 0, rightDepth = 0;Stack<TreeNode> nodeStack = new Stack<>();Stack<Integer> depthStack = new Stack<>();nodeStack.push(node);depthStack.push(1);while (!nodeStack.isEmpty()) {TreeNode currNode = nodeStack.pop();int currDepth = depthStack.pop();if (currNode.left != null) {nodeStack.push(currNode.left);depthStack.push(currDepth + 1);}if (currNode.right != null) {nodeStack.push(currNode.right);depthStack.push(currDepth + 1);}leftDepth = Math.max(leftDepth, currDepth);}return leftDepth;}public static void main(String[] args) {// 构建测试用的二叉树TreeNode root = new TreeNode(1);root.left = new TreeNode(2);root.right = new TreeNode(3);root.left.left = new TreeNode(4);root.left.right = new TreeNode(5);BinaryTreeDiameterIterative solution = new BinaryTreeDiameterIterative();System.out.println("Diameter of the binary tree: " + solution.diameterOfBinaryTree(root));}
}

迭代实现总结

  • 这个迭代版本使用了两个栈来模拟深度优先搜索(DFS)。
  • 第一个栈用于遍历树的节点,第二个栈用于跟踪节点的深度。
  • 通过遍历树的节点,计算每个节点的左子树和右子树的深度,并更新直径的最大值。
  • 尽管迭代版本是可能的,但可以看出它通常会比递归版本更加复杂和难以理解。

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

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

相关文章

【数据分享】1929-2023年全球站点的逐日降水量数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;说到常用的降水数据&#xff0c;最详细的降水数据是具体到气象监测站点的降水数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2023年全…

网络爬虫,使用存放在C的谷歌驱动报错

月 06, 2024 11:43:40 上午 org.openqa.selenium.os.OsProcess checkForError 严重: org.apache.commons.exec.ExecuteException: Execution failed (Exit value: -559038737. Caused by java.io.IOException: Cannot run program "C:\chromedriver121.exe" (in dir…

预处理详解(下)

8. 命名约定 ⼀般来讲函数的宏的使⽤语法很相似。所以语⾔本⾝没法帮我们区分⼆者。 那我们平时的⼀个习惯是&#xff1a; 把宏名全部⼤写 函数名不要全部⼤写 9. #undef 这条指令⽤于移除⼀个宏定义。 # undef NAME // 如果现存的⼀个名字需要被重新定义&#xff0c;那么…

vue3-内置组件-TransitionGroup

<TransitionGroup> 是一个内置组件&#xff0c;用于对 v-for 列表中的元素或组件的插入、移除和顺序改变添加动画效果。 与 <Transition> 的区别 <TransitionGroup> 支持和 <Transition> 基本相同的 props、CSS 过渡 class 和 JavaScript 钩子监听器&…

编程实例分享,宠物诊所电子处方怎么开,兽医电子处方模板电子版操作教程

编程实例分享&#xff0c;宠物诊所电子处方怎么开&#xff0c;兽医电子处方模板电子版操作教程 一、前言 以下操作教程以 佳易王兽医电子处方软件V16.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、在系统 设置里可以设置打印参数&#x…

elasticsearch 同义词管理热更新

背景 项目有需要做一个同义词搜索的功能&#xff0c;就去研究了下es的同义词搜索功能&#xff0c;踩了不少坑记录下 同义词本地文件读取方式 如果只是需要同义词搜索&#xff0c;不需要管理和更新&#xff0c;es本体就能支持&#xff0c;我踩的坑基本也不在这&#xff0c;就…

CleanMyMac2024如何识别并清理垃圾文件?

CleanMyMac识别并清理垃圾文件的过程主要依赖于其强大的扫描功能和智能算法。以下是具体的步骤&#xff1a; 扫描垃圾文件&#xff1a;首先&#xff0c;用户需要打开CleanMyMac软件&#xff0c;并点击“智能扫描”功能。然后&#xff0c;软件将开始自动扫描Mac系统上的各种垃圾…

幻兽帕鲁怎么样?好玩? Mac版的玩《幻兽帕鲁》也很简单,只需三个步骤

幻兽帕鲁怎么样 幻兽帕鲁是一款集合了多种游戏元素的游戏&#xff0c;它巧妙地融合了《方舟:生存进化》的野外生存挑战、《荒野之息》的开放世界探索、《魔兽世界》的多元角色互动以及宝可梦的精灵捕捉与培养等经典游戏元素。游戏的核心系统是「帕鲁」捕获&#xff0c;你可以让…

Vue3父子组件传参

一&#xff0c;父子组件传参&#xff1a; 应用场景&#xff1a;父子组件传参 Vue3碎片&#xff1a;defineEmits&#xff0c;defineProps&#xff0c;ref&#xff0c;reactive&#xff0c;onMounted 1.父组件传子组件 a.父组件传参子组件 import { ref} from vue import OnChi…

C++PythonC# 三语言OpenCV从零开发(8):图像平滑处理

文章目录 相关链接前言图像资源图像平滑处理图像学知识补充(重点)什么是卷积什么是图像滤波什么是方框滤波和均值滤波 代码PythonCCsharp 总结 相关链接 C&Python&Csharp in OpenCV 专栏 【2022B站最好的OpenCV课程推荐】OpenCV从入门到实战 全套课程&#xff08;附带课…

简单实验 spring cloud gateWay 路由实验 实验

1.概要 1.1 说明 微服务统一网关实验&#xff0c;这里简单实验一下路由的功能 1.2 实验步骤&#xff0c;使用下面这个工程作为基础工程添加了一个gateWay做如下使用 简单实践 spring cloud nacos nacos-server-2.3.0-CSDN博客 2 代码 2.1 工程文件 <?xml version&quo…

艺术创作和生活的关系

艺术出现在生产劳作中并体现出人们生活、工作、学习中&#xff0c;使人们在不受限制随意发挥缔造发明能力的体现&#xff0c;独立的精神活动领域在它逐渐演变进步的历程中越来越明显&#xff0c;也是一个人精神思想生活中很重要的一部分。艺术随着社会发展而发展。一件完美的艺…