在二叉树中查找唯一元素

时间:2016-06-19 19:29:26

标签: c++ tree

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

例如,我的树如下所示。

     3
    / \
   1   2
  /\    \
 1  3    5

上面的树,答案是3.因为有三条路径如下。

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

并且每条路径的唯一元素如下所示。

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

因此答案是3。

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

1 个答案:

答案 0 :(得分:0)

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

以您的树为例:

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

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

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

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