栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

LeetCode 深度优先遍历

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode 深度优先遍历

概述
  • 前言
  • 104 二叉树的最大深度【简单】
  • 111 二叉树的最小深度 【简单】
  • 124 二叉树中的最大路径和 【困难】
  • 后记

前言

我前面的文章《python 实现二叉树的深度&&广度优先遍历
》介绍了二叉树的相关知识。《LeetCode 102 && 429 广度优先遍历
)》这篇做了一些关于广度优先遍历的题,那么今天就来做做深度优先遍历的题。请看题:

104 二叉树的最大深度 90.36%

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / 
  9  20
    /  
   15   7

返回它的最大深度 3 。

思路

嗯,这题是深度优先遍历中基本遍历方法的变种,就多了后面的几行代码

解答
def maxDepth(root):
    """
    :type root: TreeNode
    :rtype: int
    """
    if not root:
 return 0
    left = maxDepth(root.left)
    right = maxDepth(root.right)
    if left == 0 and right != 0:
 left = left + 1
    if right == 0 and left != 0:
 right = right + 1
    return max(left, right) + 1

111 二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],

    3
   / 
  9  20
    /  
   15   7

返回它的最小深度 2.

思路

解答
# 111. 二叉树的最小深度 84.52
def minDepth(self,root):
    """
    :type root: TreeNode
    :rtype: int
    """
    if not root:
 return 0
    left = self.minDepth(root.left)
    right = self.minDepth(root.right)
    if left == 0 and right != 0:
 return right + 1
    if left != 0 and right == 0:
 return left + 1
    return min(left, right) + 1

124 二叉树中的最大路径和

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

示例 1:

输入: [1,2,3]

1
      / 
     2   3

输出: 6
示例 2:

输入: [-10,9,20,null,null,15,7]

   -10
   / 
  9  20
    /  
   15   7

输出: 42

思路

见题中注释

解答
# 124 二叉树中的最大路径和 效率 63.94
def maxPathSum(self, root):
    """
    :type root: TreeNode
    :rtype: int
    """
    self.result = -2 ** 31
    self.recursive(root)
    return self.result


def recursive(self, root):
    if root == None:
 return 0
    # 当左右子树,是小于 0 的时候,就将左右子树赋值为 0 ,因为题干是要求最大值,所以不可能去加一个负数
    left = max(0, self.recursive(root.left))
    right = max(0, self.recursive(root.right))
    # 比较当前节点下的最大值与上一个节点的值,将比较之后的结果记录下来
    self.result = max(self.result, root.val + left + right)
    # 注意审题,【从树中任意节点出发,达到任意节点的序列。】且【最大路径和】。这里是返回给父节点使用的,
    # 所以,可以返回 root.val (就是当前节点),也可以返回 root.val + max(left, right) (就是当前节点和他的子树)。
    # 又因为是求【最大路径和】所以最外层也使用了一个 max() 函数
    return max(root.val, root.val + max(left, right))

后记

今天的题就到这里了,都是循序渐进的,由一开始的基础遍历到现在的做题,一步一个脚印。加油!!
往期推荐:

爬了下知乎神回复,笑死人了~

爬来爬去(三):一万条b站评论看工作细胞

python 数据可视化利器 plus

推荐几款提高体验与效率的 Chrome 插件神器

本文首发于公众号【zone7】,关注获取最新推文。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/222041.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号