📅  最后修改于: 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
也是一个单值子树。
本文介绍了如何计算一棵树中单值子树的数量,给出了相应的算法和实现。读者可以通过本文了解到递归算法的思想,同时掌握了如何判断一棵树是否是单值子树的技巧。