当前位置: 首页 > news >正文

543.二叉树的直径

        二叉树的直径是指二叉树中的最长路径。例如

      

        在这棵树中,最长路径为4-3-2-5-6。这个最长路径是如何得出的呢?回顾之前做过的求深度的题目,我们发现二叉树的左右子树与自身结构相似,这自然地将问题分解为子问题,因此适合采用递归方法解决,那么二叉树的深度与直径是否存在某种联系呢?

        值得注意的是,最长路径必然存在"拐点"。例如在第二棵树中,路径在节点2处拐弯,得到以2为根节点的最长路径长度为3,即左子树最长链 + 右子树最长链 + 2(根节点与两个子树之间的边)。再看第三棵树中的节点5,同样遵循这一计算步骤。那么,在递归的"归"阶段,我们需要返回什么呢?以节点2为例,在返回时,我们将2-3-4这条左右子树中最长的链返回给节点5,即max(左子树最长链,右子树最长链) + 1。

综上所述,该问题的算法步骤可归纳为:

  1. 在递归遍历子树的同时计算树的直径;
  2. 当前节点作为"拐点"时的直径等于左子树最长链 + 右子树最长链 + 2;
  3. 返回给父节点的是以当前节点为根的子树的max(左子树最长链,右子树最长链) + 1。
    class Solution {
    public:int ans = 0;int Longest(TreeNode* root) {if (root == nullptr) {return -1;}int leftLen = Longest(root->left);int rightLen = Longest(root->right);ans = max(ans,leftLen + rightLen + 2);return max(leftLen,rightLen) + 1;}int diameterOfBinaryTree(TreeNode* root) {Longest(root);return ans;}
    };

        时间复杂度:O(n),每个点都会遍历一次

        空间复杂度:O(n),在最坏情况下,二叉树为一条链,需要O(n)栈空间 

相关文章:

  • JavaScript基础-对象的相关概念
  • 洛谷 全排列问题
  • BUUCTF——Nmap
  • java的面向对象思想
  • 小蜗牛拨号助手用户使用手册
  • 2.1.3
  • 【基于栈的 Vue3 路由历史管理:优雅处理多系统间的导航】
  • 使用python进行船舶轨迹跟踪
  • 符合Python风格的对象(对象表示形式)
  • 使用HtmlAgilityPack采集墨迹天气中的天气数据
  • 简单神经网络(ANN)实现:从零开始构建第一个模型
  • python项目参考文献
  • 用Python玩转人工智能——数字识别技术 之二
  • QT软件安装
  • 高效完成任务:制定标准与限时完成的双重法宝
  • 三层固定实体架构:高效实现图上的检索增强生成(RAG)
  • 2024 山东省ccpc省赛
  • 【持续更新中】架构面试知识学习总结
  • 回溯法理论基础 LeetCode 77. 组合 LeetCode 216.组合总和III LeetCode 17.电话号码的字母组合
  • 在RK3588上使用NCNN和Vulkan加速ResNet50推理全流程
  • 以军证实空袭也门多个港口
  • 戛纳打破“疑罪从无”惯例,一法国男演员被拒之门外
  • 【社论】城市更新,始终以人为核心
  • 国家卫健委通报:吊销肖某医师执业证书,撤销董某莹四项证书
  • 【社论】打破“隐形高墙”,让老年人更好融入社会
  • 普京召开俄乌谈判筹备会议,拉夫罗夫、绍伊古等出席