代码随想录day16 二叉树的最大/最小深度 完全二叉树的节点数

104. 二叉树的最大深度 - 力扣(LeetCode)

1)层序遍历

求最大深度,需要遍历至最后一层。

class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        from collections import deque
        if not root:
            return 0

        que = deque([root])
        depth = 0

        while que:
            size = len(que)
            depth += 1
            
            for i in range(size):
                cur_node = que.popleft()
                if cur_node.left:
                    que.append(cur_node.left)
                if cur_node.right:
                    que.append(cur_node.right)  
        
        return depth

2)深度优先,递归法。

关键是:若当前节点为空,返回0;否则返回其左子树深度、右子树深度中更大者,再加1

class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        
        return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1

111. 二叉树的最小深度 - 力扣(LeetCode)

1)层序遍历

求最小深度,需要在遇到叶子节点时及时退出,因此每次从队列头部取出节点就判断一下是否为叶子。

class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        from collections import deque
        if not root:
            return 0

        que = deque([root])
        depth = 0

        while que:
            size = len(que)
            depth += 1
            
            for i in range(size):
                cur_node = que.popleft()

                if cur_node.left == None and cur_node.right == None:
                    return depth
                    
                if cur_node.left:
                    que.append(cur_node.left)
                if cur_node.right:
                    que.append(cur_node.right)  

2)递归法

容易仿照maxDepth写成下面这样,但是错的

class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        
        return min(self.minDepth(root.left), self.minDepth(root.right)) + 1

错误原因:若当前节点的左右子树一个为空,另一个不为空,会将0+1作为最小深度赋给当前节点。因此需要加如下的判断:若其中一棵子树为空(深度为0)则将另一棵的深度+1赋给当前节点;只有当两棵子树都非空,才能将两子树深度较小者+1赋给当前节点。

class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0

        l_dep = self.minDepth(root.left)
        r_dep = self.minDepth(root.right)

        if l_dep == 0:
            return r_dep + 1
        if r_dep == 0:
            return l_dep + 1
        if l_dep != 0 and r_dep != 0:
            return min(l_dep, r_dep) + 1

222. 完全二叉树的节点个数 - 力扣(LeetCode)

class Solution:
    def countNodes(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        
        return 1 + self.countNodes(root.left) + self.countNodes(root.right)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值