Leetcode543. 二叉树的直径

Every day a Leetcode

题目来源:543. 二叉树的直径

解法1:深度优先搜索

首先我们知道一条路径的长度为该路径经过的节点数减 1,所以求直径(即求路径长度的最大值)等效于求路径经过节点数的最大值减 1。

而任意一条路径均可以被看作由某个节点为起点,从其左儿子和右儿子向下遍历的路径拼接得到。

假设我们知道对于该节点的左儿子向下遍历经过最多的节点数 L(即以左儿子为根的子树的深度)和其右儿子向下遍历经过最多的节点数 R(即以右儿子为根的子树的深度),那么以该节点为起点的路径经过节点数的最大值即为 L + R + 1。

我们记节点 node 为起点的路径经过节点数的最大值为 d~node~,那么二叉树的直径就是 max(d~node~) - 1。

最后的算法流程为:我们定义一个递归函数 dfs(node) 计算 d~node~,函数返回该节点为根的子树的深度。先递归调用左儿子和右儿子求得它们为根的子树的深度 L 和 R,该节点为根的子树的深度即为 max(L, R) + 1,该节点的 d~node~ = L + R + 1。

递归搜索每个节点并设一个全局变量 ans 记录 d~node~ 的最大值,树的直径就是 ans - 1。

代码:

c 复制代码
/*
 * @lc app=leetcode.cn id=543 lang=cpp
 *
 * [543] 二叉树的直径
 */

// @lc code=start
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution
{
public:
    int diameterOfBinaryTree(TreeNode *root)
    {
        int diameter = 0;
        function<int(TreeNode *)> dfs = [&](TreeNode *root) -> int
        {
            if (root == nullptr)
                return 0;
            int left = dfs(root->left);
            int right = dfs(root->right);
            diameter = max(diameter, left + right + 1);
            return max(left, right) + 1;
        };
        dfs(root);
        return diameter - 1;
    }
};
// @lc code=end

结果:

复杂度分析:

时间复杂度:O(n),其中 n 为二叉树的节点数,即遍历一棵二叉树的时间复杂度,每个结点只被访问一次。

空间复杂度:O(Height),其中 Height 为二叉树的高度。由于递归函数在递归过程中需要为每一层递归函数分配栈空间,所以这里需要额外的空间且该空间取决于递归的深度,而递归的深度显然为二叉树的高度,并且每次递归调用的函数里又只用了常数个变量,所以所需空间复杂度为 O(Height)。

相关推荐
Swift社区2 小时前
在 Swift 中实现字符串分割问题:以字典中的单词构造句子
开发语言·ios·swift
没头脑的ht2 小时前
Swift内存访问冲突
开发语言·ios·swift
没头脑的ht2 小时前
Swift闭包的本质
开发语言·ios·swift
wjs20242 小时前
Swift 数组
开发语言
stm 学习ing3 小时前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
湫ccc4 小时前
《Python基础》之字符串格式化输出
开发语言·python
mqiqe5 小时前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin5 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python