📌  相关文章
📜  对二叉树中每一层的所有低于当前层的最小值节点的所有较低层的节点进行计数(1)

📅  最后修改于: 2023-12-03 15:25:10.707000             🧑  作者: Mango

对二叉树中每一层的所有低于当前层的最小值节点的所有较低层的节点进行计数

简介

这个主题需要我们对二叉树进行遍历,并统计每一层的所有低于当前层的最小值节点的所有较低层的节点数量。这可以通过深度优先搜索(DFS)或广度优先搜索(BFS)实现。本文将介绍如何使用DFS来实现。

算法流程
  1. 进入DFS函数,在函数内部需要传入当前节点所在的层次depth、当前节点node,以及记录每一层最小值的数组minn
  2. 如果当前节点为空,直接返回。
  3. 如果当前节点所在的层次depth大于等于记录每一层最小值的数组minn的长度,就添加一个新的元素。同时将当前节点的值赋给minn数组中的对应元素。
  4. 如果当前节点的值小于minn数组中的对应元素,就更新minn数组中的对应元素。
  5. 遍历当前节点的左右子节点,如果子节点的值小于等于minn数组中的对应元素,说明它们也是低于当前层的最小值节点的较低层节点,将它们累加到计数器res中。
  6. 分别对左右子节点递归调用DFS函数,层数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

以上就是本题的解题思路和代码实现。