查找链接结构堆中的最后一个元素

时间:2009-12-10 19:24:04

标签: c++ heap

我想知道如何在堆和根元素的链接结构实现中找到最远的元素。我希望能够使用Enque和Deque元素。

一些澄清: 我的意思是假设你有一个构成最大堆的链接结构(根元素具有最大值)。您的树将在最底部的某个位置放置一个元素,您可以在插入或移除之后插入,具体取决于您是否正在进行排队或取消。你如何确定这个元素?以及如何确定树的根节点? (最重要的一个)

3 个答案:

答案 0 :(得分:1)

我不是完全肯定这是你要求的,但这是指向单链表的最后一个元素的一种方式:

T *p = NULL, *q = NULL;  // q follows p by one node
p = root;
while (p)
{
    q = p;
    p = p -> next;
}

// q now points to last node

答案 1 :(得分:0)

也许是这样的?

struct node {
  node *parent;
  node *children[2];
  int data; //or whatever else you want
};

struct heap {
  node *root;
  node *last;
};

实现这一点比使用数组要困难得多。这是一个假设的补充

void add(struct heap* h, int d)
{
  node* add = malloc(sizeof(node));
  add->data = d;
  node* current = h->root;
  while(current->children[1]) current = current->children[1];
  current->children[1] = add;
  add.parent = current;
  add.children[0] = NULL;
  add.children[1] = NULL; 
  h.last = add;
  percolate_up(h);
}

类似的东西。

答案 2 :(得分:0)

向堆结构添加内容的常规方法是从根开始并“遍历”树以查找新元素所在的位置。当你找到它去的地方时,你就把它放在那里,如果这意味着要取代已经在那个地方的东西,那么你就取上一个值并继续走下去找到它的去向。重复,直到你击中一片叶子,然后添加你“携带”的任何值作为该叶子的适当孩子。

假设你的新值是5并且堆的根节点保持为10. 5明显低于10,所以你看看10的孩子。假设他们是8和7.两者都大于5,所以选择一个(你如何选择一个取决于你是否试图保持堆平衡)。假设您选择7,它有3个孩子和4个孩子.5低于7但高于3或4,所以你用4代替4,然后看看那个节点的孩子看看在哪里放4个。假设它没有孩子,你可以添加一个包含4的新叶子。

关于如何找到根的问题 - 通常根是指向您保留的树的唯一指针。这是所有操作的起点。如果你从其他地方开始,我想你可以导航到根目录,但我会质疑为什么。