今天给大家带来的关于二叉树相关的算法题是二叉树的直径,正文如下:
题目
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例:
给定二叉树
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意:两结点之间的路径长度是以它们之间边的数目表示。
解题思路
根据本题的题意,我们得知二叉树路径的长度为该路径经过的节点数 -1,所以求直径等效于求路径经过节点数的最大值 -1; 所以我们可以使用深度优先搜索的方式来解答此题,首先定义一个全局变量值 maxd, 用于记录最长的路径,接下来遍历二叉树的三个步骤为:
- 函数参数与返回值:输入参数为传入的节点,返回值为节点的最大深度;
- 终止条件:当节点位 null 时,返回 0;
- 递归单层逻辑:递归调用左子树和右子树,求得节点的最大直径;
代码实现
最后
复杂度分析:
- 时间复杂度:O(N),其中 N 为二叉树的节点数,即遍历一棵二叉树的时间复杂度,每个结点只被访问一次。
- 空间复杂度:O(Height),其中 Height 为二叉树的高度。由于递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,而递归的深度显然为二叉树的高度,并且每次递归调用的函数里又只用了常数个变量,所以所需空间复杂度为 O(Height) 。