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

时间:2013-11-09 18:39:13

标签: algorithm data-structures

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

数据结构可以如下吗?

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

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

2 个答案:

答案 0 :(得分:1)

想象一下这样的树:

          h
    d           l
 b     f     j     n
a c   e g   i k   m o

和这样的方法:getParent(int k,char value)

If my call was getParent(3, 'm') it would return 'h'
The search would go: h->l->n->m; back three spots from m is h


If my call was getParent(2, 'e') it would return 'd'
The search would go: h->d->f->e; back two spots from e is d

答案 1 :(得分:1)

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

但是,使用这种结构,你不会得到一个特别有效的算法来找到第k个祖先 - 你必须递归地浏览整个树(从根)以找到所需的元素,并试图找到第k个祖先。

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

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

如果我们允许使用其他结构:

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

运行时间为O(k),我们想要找到第k个祖先。