📜  查找单值子树的计数(1)

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

查找单值子树的计数

概述

给定一棵树,计算这棵树中单值子树的数量。单值子树是指这棵树中所有节点值都相等的子树。

解决方案

根据定义,如果一个节点所代表的子树是单值子树,那么这个节点的值必须和它的所有子节点的值相同。因此,可以采用递归的方式,先判断当前节点代表的子树是否是单值子树,如果是,计数器加一,然后递归处理它的左右子树。

具体实现时,可以定义一个递归函数 count_unival_subtrees(root) ,它的参数是根节点 root ,返回值是单值子树数量。函数的实现如下:

def count_unival_subtrees(root):
    # 空节点表示一棵树是单值子树
    if root is None:
        return 1

    # 递归处理左右子树
    left_count = count_unival_subtrees(root.left)
    right_count = count_unival_subtrees(root.right)

    # 判断当前节点是否是单值子树
    if (root.left is None or root.left.val == root.val) and \
            (root.right is None or root.right.val == root.val):
        return left_count + right_count + 1
    else:
        return left_count + right_count
示例

假设有下面这棵树:

    5
   / \
  1   5
     / \
    5   5
   / \
  4   5

根据上面的算法,可以得到单值子树的数量为 4 。其中,子树 5 、子树 1 和子树 4 分别是单值子树,左子树 5-4 也是一个单值子树。

总结

本文介绍了如何计算一棵树中单值子树的数量,给出了相应的算法和实现。读者可以通过本文了解到递归算法的思想,同时掌握了如何判断一棵树是否是单值子树的技巧。