代码随想录算法训练营第十六天|104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

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

image.png

解题思路

前序遍历和后续遍历都可以,注意区分高度和深度

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0

        deep_left = self.maxDepth(root.left)
        deep_right = self.maxDepth(root.right)

        deep = 1 + max(deep_left, deep_right)

        return deep

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

image.png

解题思路

和求最大深度差不多,注意叶子节点不是空

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def minDepth(self, root: Optional[TreeNode]) -> int:
        if not root :
            return 0

        deep_left = self.minDepth(root.left)
        deep_right = self.minDepth(root.right)

        if root.left == None and root.right != None:
            return 1 + deep_right
        elif root.left != None and root.right == None:
            return 1 + deep_left

        return  1 + min(deep_left,deep_right)

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

解题思路

普通二叉树:层序遍历和后序递归;完全二叉树:如果是满二叉树就可以直接利用公式计算节点个数,假如完全二叉树的左右深度都一样就是满二叉树。

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

# 递归法
class Solution:
    def countNodes(self, root: Optional[TreeNode]) -> int:

        if not root:
            return 0

        c_left = self.countNodes(root.left)
        c_right = self.countNodes(root.right)
        return  1 + c_left + c_right
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

# 层序遍历
class Solution:
    def countNodes(self, root: Optional[TreeNode]) -> int:

        if not root:
            return 0

        count = 0
        queue = collections.deque([root])

        while queue:
            n = len(queue)

            for _ in range(n):
                cur  = queue.popleft()
                count += 1

                if cur.left:
                    queue.append(cur.left)
                if cur.right:
                    queue.append(cur.right)

        return count
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right

# 完全二叉树方法 满二叉树节点个数:2^depth-1
class Solution:
    def countNodes(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0

        left = root.left
        right = root.right
        left_depth = 1
        right_depth = 1 #方便后续进行位运算,写0

        while left: #计算左边的深度
            left = left.left
            left_depth += 1

        while right: # 计算右边的深度
            right = right.right
            right_depth += 1

        if left_depth == right_depth: #满二叉树
           return (2 ** left_depth) - 1 

        left_count = self.countNodes(root.left)
        right_count = self.countNodes(root.right)

        count = left_count + right_count +1 

        return count
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容