为树算法

时间:2016-08-24 22:51:44

标签: algorithm sorting tree

我正在尝试找出解决此问题的算法:

我有一个未排序的数组,其中包含将用于构建多个非二叉树的节点。这些节点有一个名称,一个id,以及他们的父母是谁的知识。

所以目前这些树是构建的,只需将根节点连接到它们的后代,并以它们创建的顺序显示它们。

所以你会得到第一棵树,其中包含所有它的后代,然后是下一棵树,它恰好出现在原始数组的下一个与之相关的后代,依此类推。

我需要按字母顺序对根节点进行排序,以便第一个树是字典中最早名称的节点,后面跟着下一个节点。

所以我基本上是自己排序树而不是所有节点。非根节点应 NOT 进行排序。所以你可以说节点的父节点是" null"那么它就是一个根节点。

注意:使用Javascript / Angular进行编程

1 个答案:

答案 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
...

然后你修改那个比较。根节点比较保持不变。当您比较两个子节点时,您需要比较它们的父节点'名。将根节点与子节点进行比较时,将根节点的名称与子节点的父节点名称进行比较。哦,你必须在将子节点与其父节点进行比较时遇到特殊情况。