📅  最后修改于: 2023-12-03 15:25:10.707000             🧑  作者: Mango
这个主题需要我们对二叉树进行遍历,并统计每一层的所有低于当前层的最小值节点的所有较低层的节点数量。这可以通过深度优先搜索(DFS)或广度优先搜索(BFS)实现。本文将介绍如何使用DFS来实现。
depth
、当前节点node
,以及记录每一层最小值的数组minn
。depth
大于等于记录每一层最小值的数组minn
的长度,就添加一个新的元素。同时将当前节点的值赋给minn
数组中的对应元素。minn
数组中的对应元素,就更新minn
数组中的对应元素。minn
数组中的对应元素,说明它们也是低于当前层的最小值节点的较低层节点,将它们累加到计数器res
中。depth
加1。def count_nodes(root):
if not root:
return 0
minn = [] # 记录每一层最小值的数组
res = 0 # 计数器,累加低于当前层的最小值节点的较低层节点数量
dfs(root, 0, minn, res)
return res
def dfs(node, depth, minn, res):
if not node:
return
if depth >= len(minn):
minn.append(node.val)
elif node.val < minn[depth]:
minn[depth] = node.val
if len(minn) > depth + 1:
res += len(minn) - depth - 1
dfs(node.left, depth+1, minn, res)
dfs(node.right, depth+1, minn, res)
# 样例一
# 5
# / \
# 2 8
# / \ \
# 1 4 9
#
# 叶子节点 1、4、9 都是低于第 1 层的最小值节点的较低层节点,共有 3 个
# 叶子节点 4、9 都是低于第 2 层的最小值节点的较低层节点,共有 2 个
# 叶子节点 9 是低于第 3 层的最小值节点的较低层节点,共有 1 个
# 结果为 3+2+1=6
root1 = TreeNode(5)
root1.left = TreeNode(2)
root1.left.left = TreeNode(1)
root1.left.right = TreeNode(4)
root1.right = TreeNode(8)
root1.right.right = TreeNode(9)
assert count_nodes(root1) == 6
# 样例二
# 2
# / \
# 2 2
#
# 任何叶子节点都不是低于第 0 层的最小值节点的较低层节点
# 结果为 0
root2 = TreeNode(2)
root2.left = TreeNode(2)
root2.right = TreeNode(2)
assert count_nodes(root2) == 0
# 样例三
# 1
# \
# 2
# \
# 3
# \
# 4
# \
# 5
# \
# 6
#
# 叶子节点 6 是低于第 5 层的最小值节点的较低层节点,共有 1 个
# 结果为 1
root3 = TreeNode(1)
root3.right = TreeNode(2)
root3.right.right = TreeNode(3)
root3.right.right.right = TreeNode(4)
root3.right.right.right.right = TreeNode(5)
root3.right.right.right.right.right = TreeNode(6)
assert count_nodes(root3) == 1
以上就是本题的解题思路和代码实现。