📜  门| GATE-CS-2014-(Set-2)|问题2(1)

📅  最后修改于: 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)。