【leetcode】543 二叉树的直径,递归解以及栈解

news/2024/7/20 22:47:32 标签: leetcode, 算法, 深度优先

题目

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

示例 :
给定二叉树

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

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/diameter-of-binary-tree

题解

题目的意思是,求树里最长的路径,也就是求左右子树深度之和的最大节点,需要注意的是这个节点不一定经过根噢。比如下图:

[4,-7,-3,null,null,-9,-3,9,-7,-4,null,6,null,-6,-6,null,null,0,6,5,null,9,null,null,-1,-4,null,null,null,-2]

在这歌树中明显节点6的左右子树深度之和才是最大的。 

思路

我的思路是,遍历这棵树每个节点,这样每个节点的左右子树深度和都能求到,然后作比较即可。

递归解法

class Solution:
    def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:

        res = 1

        def dfs(p):
            nonlocal res
            if not p:
                return 0

            l = dfs(p.left)
            r = dfs(p.right)
            res = max(res, l+r+1)

            return max(l, r) + 1

        dfs(root)
        return res - 1

堆栈解法

注意堆栈解要用后序遍历,左右子树都遍历完才可以进行求和操作

class SolutionMy:
    def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0

        p = root
        s = []
        r = None
        root.dept = 0
        maxDept = 0

        while s or p:
            while p:
                s.append(p)
                p = p.left

            t = s[-1] if s else None
            if t.right and t.right != r:
                p = t.right  
            else:
                t = s.pop()
                r = t
                if not (t.left or t.right):
                    t.dept = 1

                else:
                    lDept = t.left.dept if t.left else 0
                    rDept = t.right.dept if t.right else 0
                    t.dept = max(lDept, rDept) + 1
                    maxDept = max(maxDept, lDept+rDept+1)
                    p = None

        return max(1, maxDept) -1


http://www.niftyadmin.cn/n/157693.html

相关文章

SpringMVC-概述案例

SpringMVC-概述&案例 SpringMVC是隶属于Spring框架的一部分,主要是用来进行Web开发,是对Servlet进行了封装。 对于SpringMVC我们主要学习如下内容: SpringMVC简介请求与响应REST风格SSM整合(注解版)拦截器 SpringMVC是处于Web层的框架&#xff0…

Elsevier 期刊投稿材料的准备 系统投稿流程

关于 Elsevier 模板的使用,下载无报错模板,参考:Elsevier(爱思唯尔)LaTex 模板详细说明 本文内容:以 Knowledge-Based Systems 为例的 Elsevier 期刊系统投稿流程 投稿材料准备投稿系统流程投稿乱码解决方案…

每日学术速递3.17

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Breaking Common Sense: WHOOPS! A Vision-and-Language Benchmark of Synthetic and Compositional Images 标题:打破常识:哎呀!合成和合成图像…

计算二进制字串环形链表环形链表 II 反转字符串中的元音字母

计数二进制字串来源&#xff1a;自己LeetCode刷题696. 计数二进制子串 - 力扣&#xff08;LeetCode&#xff09;#include <string.h> int countBinarySubstrings(char * s) {int szstrlen(s);int ans0;int i1;while (i<sz-1){char ch1s[i-1];char ch2s[i];if (ch1!ch2…

【基础算法】单链表的OJ练习(6) # 复制带随机指针的链表 #

文章目录&#x1f347;前言&#x1f34e;复制带随机指针的链表&#x1f351;写在最后&#x1f347;前言 本章的链表OJ练习&#xff0c;是最后的也是最难的。对于本题&#xff0c;我们不仅要学会解题的思路&#xff0c;还要能够通过这个思路正确的写出代码&#xff0c;也就是思路…

java项目发布到Linux

参考&#xff1a;https://betheme.net/a/2751593.html?actiononClick java项目发布到Linux环境简单流程步骤&#xff1a; 一、首先打包成jar包&#xff0c;有两种方式 1、maven打包 打开idea项目。在右侧找到maven &#xff0c;有需要打包的项目&#xff0c;确定需要发布的…

3月17日,30秒知全网,精选7个热点///肝癌潜在新疗法出现///我国首个“风光火储一体化”送电特高压工程开建

///安踏体育&#xff1a;正向香港联合交易所有限公司申请批准增设人民币柜台 ///商务部&#xff1a;广交会全面恢复线下展 本届广交会将首次启用新落成展馆&#xff0c;展览面积扩大到150万平方米&#xff0c;线下参展企业超过3万家 ///韩日同意解除涉半导体产品出口限制 双方…

SpringBoot介绍。

目录 一、SpringBoot简介 1、SpringBoot开发步骤 2、官网构建工程 3、SpringBoot概述 二、配置文件 1、配置文件格式 2、yaml格式 3、yaml配置文件数据读取 三、多环境配置 1、yam文件 2、properties文件 3、命令行启动参数设置 四、SpringBoot整合 1、SpringBo…