我正在尝试找出解决此问题的算法:
我有一个未排序的数组,其中包含将用于构建多个非二叉树的节点。这些节点有一个名称,一个id,以及他们的父母是谁的知识。
所以目前这些树是构建的,只需将根节点连接到它们的后代,并以它们创建的顺序显示它们。
所以你会得到第一棵树,其中包含所有它的后代,然后是下一棵树,它恰好出现在原始数组的下一个与之相关的后代,依此类推。
我需要按字母顺序对根节点进行排序,以便第一个树是字典中最早名称的节点,后面跟着下一个节点。
所以我基本上是自己排序树而不是所有节点。非根节点应 NOT 进行排序。所以你可以说节点的父节点是" null"那么它就是一个根节点。
注意:使用Javascript / Angular进行编程
答案 0 :(得分:0)
好像你可以编写一个比较函数来为你做这件事。你不会说出你正在使用的语言,但我认为你可以从中收集它的主旨:
int Compare(Node node1, Node node2)
{
if (node1.Parent == null and node2.Parent == null)
{
// two root nodes. Compare their names.
return node1.Name.CompareTo(node2.Name);
}
if (node1.Parent == null)
{
// node1 is a root node and node2 isn't.
// node1 sorts first.
return -1;
}
if (node2.Parent == null)
{
// node2 is a root node and node1 isn't.
// node2 sorts first.
return 1;
}
// neither is a root node, so they're considered equal.
return 0;
}
这会对它进行排序,以便您拥有:
root1
root2
root3
(other roots)
all children
现在,如果您希望对数组进行排序,那么您将拥有:
root1
child of root1
child of root1
child of root1
root2
child of root2
child of root2
root3
...
然后你修改那个比较。根节点比较保持不变。当您比较两个子节点时,您需要比较它们的父节点'名。将根节点与子节点进行比较时,将根节点的名称与子节点的父节点名称进行比较。哦,你必须在将子节点与其父节点进行比较时遇到特殊情况。