从数组中删除子节点的算法

时间:2013-06-26 05:07:25

标签: java arrays algorithm data-structures tree

我必须为我的项目写一个algorithm。以下是问题

树状结构,只有一个功能被暴露,即**getAllChildNodes**,它返回特定节点的所有子节点。 现在我得到了一个节点数组,我必须只保留其中最顶层的父节点。

示例:假设有3棵树

Tree 1 : P1 has two children C11 & C12

Tree 2 : P2 has 1 children C21, and C21 has 2 child C22, C23

Tree 3 : P3 has 2 Children C31 and C32

Now if given an array say { C11, C21, C22 , P1, P3, C32}
 The expected result is { C21, P1 , P3 }

如果我需要更多信息,请告诉我。

更多信息: 我通过首先获取数组的第一个元素的所有子元素然后与数组的其余元素进行比较来完成它,并且与每个元素类似。但这更复杂..即n * n * getAllChildNodes。我在这里是为了更好的建议

3 个答案:

答案 0 :(得分:0)

选择数组的第i个元素并将其所有子元素添加到散列映射(使用给定的函数)。为i 1到n(完全通过)执行此操作

循环i为1到n,并且对于每次迭代,检查元素是否存在于hashmap中。

如果存在,请将其从数组中删除

否则继续

注意检查元素是否属于hashmap的顺序是O(1),并且加法顺序也是O(1),avearage。所以算法是O(n * getAllChlidNodes)平均值

答案 1 :(得分:0)

您可以轻松完成此操作。 首先创建一个方法isPresent(node),以检查您输入的节点是否存在于数组中。然后输入给定的每个节点以查找其父节点。

if(isPresent(x->parent)) push(x->parent);

继续此操作以获取整个列表。 现在recursively检查current list是否有parents present。一旦你开始做,你就会得到它。如果有任何父母只有pop()这些元素。 希望这会有所帮助:)

答案 2 :(得分:0)

如果你可以像getParentNode(childNode)那样首先得到一个函数,或者将child的map / multimap创建为key,将parent作为值作为预处理步骤创建,那么问题将变得非常容易。

如果你有getParentNode(childNode),那么只需遍历数组并将父项推送到集合中。

如果您将child的map / multimap作为键,而parent作为值作为预处理步骤,则应用adi

所述的算法