LeetCode 深度优先遍历

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zone_/article/details/83826575

本文首发于公众号「zone7」,关注获取最新推文!

image

送书福利,送十本 Python 类书籍

概述

  • 前言
  • 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】,关注获取最新推文。

猜你喜欢

转载自blog.csdn.net/zone_/article/details/83826575