我想在路径中找到最大数量的唯一元素。 (路径是从根到叶)。
例如,我的树如下所示。
3
/ \
1 2
/\ \
1 3 5
上面的树,答案是3.因为有三条路径如下。
3-1-1
3-1-3
3-2-5.
并且每条路径的唯一元素如下所示。
3-1
3-1
3-2-5.
因此答案是3。
我对如何获得号码的想法如下。 首先,我找到了从根到叶的所有路径。当指针到达叶节点时,我打印了路径并计算了唯一元素。并迭代此过程,直到访问了所有节点。
答案 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是你的整数所在范围的大小。 。您可以在相应的索引处切换布尔值,而不是添加和删除元素。