写点什么

手撸二叉树之二叉树的直径

发布于: 2 小时前
手撸二叉树之二叉树的直径

Hello, 大家好,今天是我参加 9 月更文的第 2 天,今天给大家带来的关于二叉树相关的算法题是二叉树的直径,正文如下:


题目

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。


示例


给定二叉树


          1         / \        2   3       / \           4   5    
复制代码


返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。


注意:两结点之间的路径长度是以它们之间边的数目表示。

解题思路

根据本题的题意,我们得知二叉树路径的长度为该路径经过的节点数 -1,所以求直径等效于求路径经过节点数的最大值 -1;所以我们可以使用深度优先搜索的方式来解答此题,首先定义一个全局变量值 maxd, 用于记录最长的路径,接下来遍历二叉树的三个步骤为:


  1. 函数参数与返回值:输入参数为传入的节点,返回值为节点的最大深度;

  2. 终止条件:当节点位 null 时,返回 0;

  3. 递归单层逻辑:递归调用左子树和右子树,求得节点的最大直径;

代码实现

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) 。

发布于: 2 小时前阅读数: 2
用户头像

佛系编码 2019.05.13 加入

红鲤鱼与绿鲤鱼与驴。

评论

发布
暂无评论
手撸二叉树之二叉树的直径