Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在AVL树中定位最低共同祖先_Algorithm_Avl Tree - Fatal编程技术网

Algorithm 在AVL树中定位最低共同祖先

Algorithm 在AVL树中定位最低共同祖先,algorithm,avl-tree,Algorithm,Avl Tree,我有一个AVL树和2个键。我如何找到最低的共同祖先,我指的是高,而不是低复杂度的价值? 我在stackoverflow上看到了答案,但我承认我并不完全理解。它包括找到从每个键到根的路由,然后比较它们。我不确定这如何满足向上移动并标记节点的第一个节点的复杂性要求。对于第二个节点,向上移动并查看路径上的节点是否已标记。一旦找到标记的节点,就可以停止。并通过再次执行第一个路径来移除标记 如果无法直接标记树中的节点,请修改包含的值,以包含可以标记的位置。如果您也不能这样做,那么添加一个hashmap来存

我有一个AVL树和2个键。我如何找到最低的共同祖先,我指的是高,而不是低复杂度的价值?
我在stackoverflow上看到了答案,但我承认我并不完全理解。它包括找到从每个键到根的路由,然后比较它们。我不确定这如何满足向上移动并标记节点的第一个节点的复杂性要求。对于第二个节点,向上移动并查看路径上的节点是否已标记。一旦找到标记的节点,就可以停止。并通过再次执行第一个路径来移除标记

如果无法直接标记树中的节点,请修改包含的值,以包含可以标记的位置。如果您也不能这样做,那么添加一个hashmap来存储标记的节点

这是奥洛恩,因为这棵树很深,最坏的情况下你要走三次才能找到根


此外,如果您愿意,您可以交替两条路径的步骤,而不是首先完全走第一条路径。请注意,然后两条路径都必须检查标记。如果您希望这两个节点的祖先都在本地,那么这可能会更好。渐近运行时与上面相同。

AVL树平衡二叉搜索树的更好解决方案是我使用了类似C指针的表示法-

设K1和K2为2个键,将为其找到LCA。假设K1key>=K1和P->key>K1和P->key>K2:P=P->left 否则P=P->right 重复步骤3至5 返回的p指向所需的LCA


请注意,这种方法仅适用于BST,而不适用于任何其他二叉树。

那么,为什么不链接到这个老问题?无论如何,AVL树的高度是Olog n,根路径的长度也是。我知道logn是高度,但是我如何比较这两条路径呢?为什么是马克?只要向上走,倒转路径,然后在两条路径上同时往回走,直到它们分开。这也是可能的,你应该把它作为一个答案。我甚至没有想到它,因为它需要动态内存或一个聪明的实现来构建列表,而且它不能像交替版本那样使用可能的局部性。但是他的算法还有其他的优点,我认为,他应该把它作为一个答案,实际上它可以在恒定的内存中完成。只需执行标准的树遍历。当在当前节点的不同子树中找到这两个键时,您已经找到了LCA