LeetCode 深度优先遍历

作者: zone7_ | 来源:发表于2018-11-01 18:38 被阅读0次

概述

  • 前言
  • 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))

后记

今天的题就到这里了,都是循序渐进的,由一开始的基础遍历到现在的做题,一步一个脚印。加油!!
本文首发于公众号【zone7】,关注获取最新推文。

相关文章

  • 2020 5-6 ARTS

    ARTS1 Algorithm LeetCode 76 单词搜索 深度优先遍历,难度中等。 用深度...

  • 『图』钥匙和房间841

    题目相关 原题链接:841. 钥匙和房间 - 力扣(LeetCode) 涉及知识:图、深度优先遍历、广度优先遍历 ...

  • js-树的遍历

    数据 广度优先遍历 深度优先遍历 深度优先不递归

  • 图的深度优先遍历和马踏棋盘算法

    图的深度优先遍历思想 图的遍历通常有两种遍历次序方案: 深度优先遍历和广度优先遍历。深度优先遍历(DepthFir...

  • LeetCode 深度优先遍历

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

  • 图的遍历,golang实现

    广度优先遍历 深度优先遍历

  • 广度优先遍历和深度优先遍历

    深度优先遍历 广度优先遍历

  • 数据结构与算法学习-图的遍历

    图的遍历可以分为:深度优先遍历和广度优先遍历 一、深度优先遍历 深度优先遍历的实现思路 将图的顶点和边信息输⼊入到...

  • 数据结构—图的遍历

    根据图的存储方式可分为邻接矩阵的深度优先遍历和邻接表的深度优先遍历。 一、深度优先遍历 1、邻接矩阵的深度优先遍历...

  • 图的遍历

    1.前言 对于图的遍历来说通常有两种遍历次序,它们是深度优先遍历和广度优先遍历 2.深度优先遍历 深度优先遍历(D...

网友评论

    本文标题:LeetCode 深度优先遍历

    本文链接:https://www.haomeiwen.com/subject/sslztqtx.html