algorithm - 设计一棵多子树并找到第 k 个祖先

标签 algorithm data-structures

为具有多个节点的树提供一个数据结构,并编写一个算法来查找节点的第 k 个祖先。

数据结构可以是下面的吗?

struct node
{
   int data;
   int n;
   struct node** child;
}

我对找到第 k 个祖先感到困惑。

最佳答案

是的,提供的结构将是一个多子(k-ary)树。

但是,使用该结构,您不会获得特别有效的算法来查找第 k 个祖先 - 您将不得不递归地查看整个树(从根开始)以找到所需的元素,并向上递归找到第 k 个祖先。

  • 如果当前元素是我们要查找的元素,则返回0
  • 如果其中一个子树包含我们要查找的元素(即调用不返回 -1):
    • 如果该值为 k,我们找到了第 k 个祖先。
    • 否则返回该值 +1
  • 否则返回-1

运行时间将为 O(n),其中 n 是树中的节点数。

如果允许我们使用不同的结构:

除了/代替子节点指针,我们可以为每个节点存储一个父节点指针。然后我们可以简单地迭代查看父节点,直到达到所需的深度。

运行时间将是 O(k),我们要在其中找到第 k 个祖先。

关于algorithm - 设计一棵多子树并找到第 k 个祖先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19881597/

相关文章:

c++ - 为给定的字符串生成所有可能的回文

c - 在链表的末尾插入一个节点

java - 数据结构等同于 hashset 但有这些变化?

c++ - 传递结构和参数如何影响函数的性能

c++ - 将新元素插入已排序的链表时出现段错误

java - 链表头尾的实用性

algorithm - 非确定性 PDA 如何以及为何比确定性 PDA 更强大?

algorithm - 具有大量文件的目录结构的树遍历算法

ruby - Anagrams Code Kata,Ruby 解决方案非常慢

java - 在 Java 中使用图论算法的面向对象方法是否比基于一般数组的操作更快?