【问题标题】:find the unique elements in the binary tree找到二叉树中的唯一元素
【发布时间】:2016-10-21 00:44:11
【问题描述】:

我想在路径中找到最大数量的唯一元素。 (路径是从根到叶)。

例如,我的树如下。

     3
    / \
   1   2
  /\    \
 1  3    5

在树之上,答案将是 3。因为下面有 3 条路径。

3-1-1
3-1-3
3-2-5. 

每条路径的独特元素如下。

3-1
3-1
3-2-5. 

因此答案是 3。

我对如何获取数字的想法如下。 首先,我找到了从根到叶的所有路径。当指针到达叶节点时,我打印了路径并计算了唯一元素。并迭代此过程,直到访问所有节点。

【问题讨论】:

    标签: c++ tree


    【解决方案1】:

    您可以构建第二个形状相似的树,其中包含每个子路径中唯一元素的数量(从根到任何节点,包括根和叶)。该树可以像这样从根到叶构建:根值始终为 1,因为从根到根的路径包含一个唯一元素,而任何其他节点的值要么是其父节点的值,要么是其他节点的值。

    以你的树为例:

        3             1
       / \           / \
      1   2    =>   2   2
     / \   \       / \   \
    1   3   5     2   2   3
    

    每个叶子的值是从根到该叶子的唯一元素的数量。

    虽然您可以保留它以供后续使用,但您实际上并不需要构建树。您只需要执行深度优先遍历,同时跟踪数据结构中当前子路径中的唯一元素,比如说一个向量。由于您想要最大数量的唯一元素,因此您需要在碰到叶子时跟踪该向量的大小。

    数据结构可以不是向量,但这取决于你的元素是什么。您可能可以使用有序集,这相当于保持向量排序。如果可以散列元素,则可以使用“散列集”(C++11 中的std::unordered_set)。如果您的元素是简单整数并且它们的值都在相对较小的范围内,则可以使用布尔向量而不是哈希集:最初,向量将 N 个布尔值保持为假,N 是整数所在范围的大小. 不是添加和删除元素,而是在相应的索引处切换布尔值。

    【讨论】:

    • 感谢您的回复。我认为这两种情况的时间复杂度都等于 O(n)。对吗?
    • 三种情况。 n 是元素的总数,d 是树的深度,简单的未排序向量给你 O(nd)(相当于 O(nlog n)),而 set 或 sorted向量给你 O(nlog d)。至于哈希集,你最终得到 *amortized O(n)。但是,请记住,向量通常要快得多。这就是为什么最后一个解决方案(布尔向量)会是最好的。还要注意std::vector<bool>,因为它是一种节省空间但不节省时间的实现。相反,您可以使用std::array 或其他类型来替代bool
    猜你喜欢
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多