104. 二叉树的最大深度 - 力扣(LeetCode)
1.第一想法
层序遍历,
- 首先从队尾弹出一个元素,那就要看它是否有左右节点,
- 如果有节点,压入队首。
- 如果没有就跳过,看下一个弹出的节点。
- 直到队中没有任何元素。就说明当前统计的深度就是二叉树的最大深度。
# 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.第一想法
同样是层序遍历,但是最小深度应该是只要遇到叶子节点就立刻停掉。当前层就是最小深度。
- 队尾出来的节点,如果是叶子,就立刻结束。
- 如果不是叶子,就加入到队首中。
# 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.读文档
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分钟。