LeetCode 算法题库【104】——二叉树的最大深度

二叉树的最大深度

题目描述:

timu

解题思路:
  • 第一种:递归。这个思路应该说是最容易想到的了。我是设了另一个函数来递归计算这个最大深度。我们分几种情况来讨论,首先先排除掉这两个特殊情况:如果二叉树为空,返回0,如果二叉树只有根节点,也就是没有任何子节点,返回1 。然后我们需要想,如果这棵二叉树的某个结点有左右两个子节点,那么,下一次递归我们对这两个子节点都要递归一次,然后取其中递归最深的那次深度,因为每次能够递归就说明这个节点有子节点,也就是下面还有一层深度,所以每次递归完成返回值都要+1。然后如果遇到这个结点只有左子结点或者右子节点,那么我们就只考虑有子节点的那一边,开始递归。直到最后的子节点没有左右子节点了,说明就到底了,所以就只剩下当前这一行了,所以就返回1。最后递归结束返回的数值就是这个二叉树的最大深度了。
  • 时间复杂度:O(N)
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if not root:
            return 0
        if not root.left and not root.right:
            return 1
        return self.CountTree(root)

    def CountTree(self, Tree):
        if not Tree.left and not Tree.right:
            return 1
        if Tree.right and Tree.left:
            return 1 + max(self.CountTree(Tree.left), self.CountTree(Tree.right))
        if Tree.right:
            return 1 + self.CountTree(Tree.right)
        if Tree.left:
            return 1 + self.CountTree(Tree.left)

1

  • 第二种:改进版递归。这个方法我们可以尝试不要另外设函数,这里我们直接在当前函数递归,也不难理解,我们就分两种情况递归,也就是求这个二叉树的左半边的最大深度和右半边的最大深度,然后返回这两个深度最大的那个,就是这个二叉树的最大深度,其他的细节和第一种都很类似,就不再写了。
  • 时间复杂度:O(N)
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
        
class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if not root:
            return 0
        if not root.left and not root.right:
            return 1
        else:
            left_max = 1 + self.maxDepth(root.left)
            right_max = 1 + self.maxDepth(root.right)
        return max(left_max, right_max)
        # return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1

2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值