📅  最后修改于: 2023-12-03 14:58:29.237000             🧑  作者: Mango
给定一个二叉树和两个整数k1和k2,找到所有值介于k1和k2之间的节点并返回它们的频次。
假设有以下二叉树:
8
/ \
2 10
/ \ \
1 5 14
那么当k1=5、k2=14时,期望的返回值是:
[(5, 1), (8, 1), (10, 1), (14, 1)]
可以使用递归来遍历整个二叉树,检查每个节点的值是否介于k1和k2之间。如果是,将该节点的值存入一个列表中。最后,使用Python内置函数collections.Counter()
(计数器)来统计列表中各元素出现的次数,并返回一个字典,其中键为节点的值,值为节点的频次。
代码如下:
import collections
def count_nodes(root, k1, k2):
nodes = []
def traverse(node):
if not node:
return
if k1 <= node.val <= k2:
nodes.append(node.val)
traverse(node.left)
traverse(node.right)
traverse(root)
return collections.Counter(nodes)
还可以使用迭代和栈来实现遍历。首先将根节点存入栈中,然后进入循环,直到栈为空。每次迭代,弹出栈中的一个节点,检查其是否介于k1和k2之间。如果是,将其值存入一个列表中。然后将该节点的左右子节点(如果有)依次压入栈中。最后,使用collections.Counter()
计算每个节点的频次并返回结果。
代码如下:
import collections
def count_nodes(root, k1, k2):
stack, nodes = [], []
stack.append(root)
while stack:
node = stack.pop()
if node:
if k1 <= node.val <= k2:
nodes.append(node.val)
stack.append(node.left)
stack.append(node.right)
return collections.Counter(nodes)
无论采用哪种解法,遍历整个二叉树的时间复杂度都为O(n),其中n为二叉树节点个数。计算频次的时间复杂度为O(klogk),其中k为查询结果个数,并且k <= n。因此,总时间复杂度为O(n + klogk)。空间复杂度为O(n)。