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

    相关文章

      网友评论

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

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