c语言sscanf函数的用法是什么
237
2022-08-28
手撸二叉树之二叉树的直径
今天给大家带来的关于二叉树相关的算法题是二叉树的直径,正文如下:
题目
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例:
给定二叉树
1 / \ 2 3 / \ 4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意:两结点之间的路径长度是以它们之间边的数目表示。
解题思路
根据本题的题意,我们得知二叉树路径的长度为该路径经过的节点数 -1,所以求直径等效于求路径经过节点数的最大值 -1; 所以我们可以使用深度优先搜索的方式来解答此题,首先定义一个全局变量值 maxd, 用于记录最长的路径,接下来遍历二叉树的三个步骤为:
函数参数与返回值:输入参数为传入的节点,返回值为节点的最大深度;终止条件:当节点位 null 时,返回 0;递归单层逻辑:递归调用左子树和右子树,求得节点的最大直径;
代码实现
class Solution { int maxd=0; public int diameterOfBinaryTree(TreeNode root) { depth(root); return maxd; } public int depth(TreeNode node){ if(node==null){ return 0; } int Left = depth(node.left); int Right = depth(node.right); //将每个节点最大直径(左子树深度+右子树深度)当前最大值比较并取大者 maxd = Math.max(Left+Right, maxd); //返回节点最大深度 return Math.max(Left,Right)+1; }}
最后
复杂度分析:
时间复杂度:O(N),其中 N 为二叉树的节点数,即遍历一棵二叉树的时间复杂度,每个结点只被访问一次。空间复杂度:O(Height),其中 Height 为二叉树的高度。由于递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,而递归的深度显然为二叉树的高度,并且每次递归调用的函数里又只用了常数个变量,所以所需空间复杂度为 O(Height) 。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~