JavaScript-使用数组或链表更快地计算一棵树的高度

JavaScript-使用数组或链表更快地计算一棵树的高度,javascript,algorithm,linked-list,tree,breadth-first-search,Javascript,Algorithm,Linked List,Tree,Breadth First Search,我无法使我的代码在更长的输入上运行得更快,即在更高或更宽的树上。它在1000左右高度的树上失效。 有人能建议对我的代码或任何其他算法进行任何编辑以使代码运行更快吗? 问题-给您一个有根树的描述。您的任务是计算并输出其高度。回忆起 (有根)树的高度是节点的最大深度,或者是与树的最大距离 从叶到根。您得到的是任意树,不一定是二叉树 输入格式。第一行包含节点数,因此创建一个包含父节点数和高度的结构数组。最初,高度将全部为0,但根除外,根的高度设置为1。根据您的示例输入,您有: [ {4, 0}

我无法使我的代码在更长的输入上运行得更快,即在更高或更宽的树上。它在1000左右高度的树上失效。 有人能建议对我的代码或任何其他算法进行任何编辑以使代码运行更快吗?

问题-给您一个有根树的描述。您的任务是计算并输出其高度。回忆起 (有根)树的高度是节点的最大深度,或者是与树的最大距离 从叶到根。您得到的是任意树,不一定是二叉树


输入格式。第一行包含节点数,因此创建一个包含父节点数和高度的结构数组。最初,高度将全部为0,但根除外,根的高度设置为1。根据您的示例输入,您有:

[
    {4, 0},
    {-1, 1},
    {4, 0},
    {1, 0},
    {1, 0}
}
现在,从列表中的第一项开始,查找其父项。如果父节点的高度不为零,则节点的高度比父节点的高一个。否则,请找到父对象的父对象,并查看其高度是否已设置,等等

您可以使用堆栈来跟踪所访问的节点

算法如下所示:

for each index, n
    while a[n].height == 0
        stack.push(n)
        n = a[n].parent
    parent = n;
    while !stack.isEmpty()
        stack.pop(n)
        a[n].height = a[parent].height + 1
        parent = n
此时,已设置所有节点的高度。您可以扫描阵列以查找最大高度

一个明显的优化是在扫描树时跟踪最大高度。也就是说,清空堆栈后,可以执行以下操作:

    if (a[n].height > max_height)
        max_height = a[n].height;
根据您的输入,我们从节点0开始。它的高度是0,因此将0推到堆栈上并查看节点4。它的高度也是0,因此您可以查看节点1。其高度为1,因此可以弹出堆栈,并为节点4指定高度值2。然后再次弹出堆栈,并将节点0的高度指定为3。你最终会得到:

[
    {4, 3},
    {-1, 1},
    {4, 0},
    {1, 0},
    {1, 2}
}
节点1已设置其高度。节点2的高度为0,因此按下它并查看节点4。其高度为2,因此可以弹出堆栈并将高度值指定给节点2 3

节点3的高度为0,因此可以查看其父节点,其高度为1。所以节点3的高度是2。最后,查看节点4,其高度已设置。你的结果是:

[
    {4, 3},
    {-1, 1},
    {4, 3},
    {1, 2},
    {1, 2}
}

因此,创建一个具有父节点编号和高度的结构数组。最初,高度将全部为0,但根除外,根的高度设置为1。根据您的示例输入,您有:

[
    {4, 0},
    {-1, 1},
    {4, 0},
    {1, 0},
    {1, 0}
}
现在,从列表中的第一项开始,查找其父项。如果父节点的高度不为零,则节点的高度比父节点的高一个。否则,请找到父对象的父对象,并查看其高度是否已设置,等等

您可以使用堆栈来跟踪所访问的节点

算法如下所示:

for each index, n
    while a[n].height == 0
        stack.push(n)
        n = a[n].parent
    parent = n;
    while !stack.isEmpty()
        stack.pop(n)
        a[n].height = a[parent].height + 1
        parent = n
此时,已设置所有节点的高度。您可以扫描阵列以查找最大高度

一个明显的优化是在扫描树时跟踪最大高度。也就是说,清空堆栈后,可以执行以下操作:

    if (a[n].height > max_height)
        max_height = a[n].height;
根据您的输入,我们从节点0开始。它的高度是0,因此将0推到堆栈上并查看节点4。它的高度也是0,因此您可以查看节点1。其高度为1,因此可以弹出堆栈,并为节点4指定高度值2。然后再次弹出堆栈,并将节点0的高度指定为3。你最终会得到:

[
    {4, 3},
    {-1, 1},
    {4, 0},
    {1, 0},
    {1, 2}
}
节点1已设置其高度。节点2的高度为0,因此按下它并查看节点4。其高度为2,因此可以弹出堆栈并将高度值指定给节点2 3

节点3的高度为0,因此可以查看其父节点,其高度为1。所以节点3的高度是2。最后,查看节点4,其高度已设置。你的结果是:

[
    {4, 3},
    {-1, 1},
    {4, 3},
    {1, 2},
    {1, 2}
}