在二叉树中找到唯一元素
find the unique elements in the binary tree
我想在路径中找到最大数量的唯一元素。
(路径是从根到叶)。
例如我的树如下
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。
我的取号思路如下。
首先,我找到了从根到叶的所有路径。当指针到达叶节点时,我打印路径并计算唯一元素。并迭代此过程,直到访问了所有节点。
您可以构建第二个形状相似的树,它包含每个子路径中的唯一元素的数量(从根到任何节点,包括根和叶)。该树可以像这样从根到叶构建:根值始终为 1,因为从根到根的路径包含一个唯一元素,并且任何其他节点的值是其父节点的值或多一个。
以你的树为例:
3 1
/ \ / \
1 2 => 2 2
/ \ \ / \ \
1 3 5 2 2 3
每个叶子的值是从根到叶子的唯一元素的数量。
虽然您可以保留它以供后续使用,但您实际上并不需要构建树。您只需要执行深度优先遍历,同时跟踪数据结构中当前子路径中的唯一元素,比方说一个向量。由于您想要最大数量的唯一元素,因此您需要在点击叶子时跟踪该向量的大小。
数据结构可以是向量以外的其他形式,但这取决于您的元素是什么。您可能可以使用有序集,这相当于保持向量排序。如果可以散列元素,则可以使用 "hashset"(C++11 中的 std::unordered_set
)。如果你的元素是简单的整数并且它们的值都在一个相对较小的范围内,你可以使用布尔向量而不是哈希集:最初,向量将 N 个布尔值保持为 false,N 是你的整数范围的大小. 不是添加和删除元素,而是在相应的索引处切换布尔值。
我想在路径中找到最大数量的唯一元素。 (路径是从根到叶)。
例如我的树如下
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。
我的取号思路如下。 首先,我找到了从根到叶的所有路径。当指针到达叶节点时,我打印路径并计算唯一元素。并迭代此过程,直到访问了所有节点。
您可以构建第二个形状相似的树,它包含每个子路径中的唯一元素的数量(从根到任何节点,包括根和叶)。该树可以像这样从根到叶构建:根值始终为 1,因为从根到根的路径包含一个唯一元素,并且任何其他节点的值是其父节点的值或多一个。
以你的树为例:
3 1
/ \ / \
1 2 => 2 2
/ \ \ / \ \
1 3 5 2 2 3
每个叶子的值是从根到叶子的唯一元素的数量。
虽然您可以保留它以供后续使用,但您实际上并不需要构建树。您只需要执行深度优先遍历,同时跟踪数据结构中当前子路径中的唯一元素,比方说一个向量。由于您想要最大数量的唯一元素,因此您需要在点击叶子时跟踪该向量的大小。
数据结构可以是向量以外的其他形式,但这取决于您的元素是什么。您可能可以使用有序集,这相当于保持向量排序。如果可以散列元素,则可以使用 "hashset"(C++11 中的 std::unordered_set
)。如果你的元素是简单的整数并且它们的值都在一个相对较小的范围内,你可以使用布尔向量而不是哈希集:最初,向量将 N 个布尔值保持为 false,N 是你的整数范围的大小. 不是添加和删除元素,而是在相应的索引处切换布尔值。