代码训练营第17天|104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数

91 阅读2分钟

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

1.第一想法

层序遍历,

  1. 首先从队尾弹出一个元素,那就要看它是否有左右节点,
    1. 如果有节点,压入队首。
    2. 如果没有就跳过,看下一个弹出的节点。
  2. 直到队中没有任何元素。就说明当前统计的深度就是二叉树的最大深度。
# 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 root is None:
            return 0
        else:
            node_queue = deque()
            node_queue.append(root)
            level_num = 0
            while node_queue:
                size = len(node_queue)
                for i in range(size):
                    node = node_queue.popleft()
                    if node.left:
                        node_queue.append(node.left)
                    if node.right:
                        node_queue.append(node.right)
                level_num += 1
            return level_num

2.读文档后的想法

代码随想录 (programmercarl.com) 没毛病,我还用的是迭代法。

3.学习时长

30分钟

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

1.第一想法

同样是层序遍历,但是最小深度应该是只要遇到叶子节点就立刻停掉。当前层就是最小深度。

  1. 队尾出来的节点,如果是叶子,就立刻结束。
  2. 如果不是叶子,就加入到队首中。
# 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 root is None:
            return 0
        else:
            node_queue = deque()
            node_queue.append(root)
            level_num = 0
            while node_queue:
                size = len(node_queue)
                level_num += 1
                for i in range(size):
                    node = node_queue.popleft()
                    if (not node.left) and (not node.right):
                        return level_num
                    if node.left:
                        node_queue.append(node.left)
                    if node.right:
                        node_queue.append(node.right)
            return level_num

2.读文档

代码随想录 (programmercarl.com)

3.学习时长

20分钟。

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

1.第一想法

普通二叉树的方法就是层序遍历统计总过有多少个节点,但是完全二叉树的信息能够如何被充分利用呢?

2.读文档

代码随想录 (programmercarl.com) 我们可以通过递归来利用完全二叉树这个信息: 终止条件:root=None 返回0,因为它的左右子树都不是完全二叉树,自己也不是个节点,所以返回0就好。 返回参数:包括当前root在内所有节点。 一层递归逻辑:如果当前左右最深叶子节点深度相等,那就是满二叉树,用公式算就好。如果不相等,说明不是满二叉树,我们需要左右子树再递归,并返回左右两边的节点总数加上当前root节点。 输入:有个根节点就好。

# 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 root is None:
            return 0
        else:
            left_depth = 0
            right_depth = 0
            cur = root
            while cur:
                left_depth += 1
                cur = cur.left
            cur = root
            while cur:
                right_depth += 1
                cur = cur.right
            if left_depth == right_depth:
                return (2 ** left_depth) - 1
            else:
                return self.countNodes(root.left) + self.countNodes(root.right) + 1

3.学习时长

40分钟。