2009-12-10 73 views
0

我想知道如何去查找堆和根元素的链接结构实现中最远的元素。我想要能够Enque和Deque元素。查找链接结构堆中的最后一个元素

一些说明: 我的意思是让你说有一个链接结构构成最大堆(根元素具有最大值)。你的树会在底部有一个元素,你可以在后面插入或删除,取决于你是否入侵或出队。你如何确定这个元素?以及如何确定树的根节点? (最上面的一个)

+0

方法是作弊:维护指向终止节点(或终止节点的父节点)的指针。还要考虑实现指向父节点的指针。这会让你在追加内存时获得更好的性能。 – 2009-12-10 21:21:35

回答

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 
+0

+1我认为你打败了我,如果你使用'while(p-> next)''你不需要额外的变量'q' – 2009-12-10 19:49:13

+0

啊我已经知道一个,但我的意思是让你说你有构成最大堆的链接结构(根元素具有最大值)。你的树会在底部有一个元素,你可以在后面插入或删除,取决于你是否入侵或出队。你如何确定这个元素?以及如何确定树的根节点? (排名第一) – bob 2009-12-10 19:56:59

+0

如果您使用的是链接列表结构,则此答案完美无缺。如果您想始终能够访问它,您可以添加另一个始终指向根目录的指针。但是,你提到了一棵树,所以现在我很困惑。 – ChadNC 2009-12-10 20:03:31

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); 
} 

类似的东西。

+0

事情是我想搜索二叉树(堆),并找出最后的位置是什么。我可以从一开始就将指针设置为root,但我必须执行一些搜索才能找到实际的最后一个值。想知道如何去找到树中最远节点的路径。 – bob 2009-12-10 20:37:09

+0

最后一个指针指向最后一个元素,并且每次使用添加或删除更改堆时更新它 – 2009-12-10 20:40:56

0

将某些东西添加到堆结构的常规方法是从根处开始并“漫游”树以找到新元素所在的位置。当你找到它的位置时,你把它放在那里,如果这意味着替换那个地方已经存在的东西,那么你采取以前的价值,并继续走下去找到它去的地方。重复,直到你点击一片叶子,然后添加你“携带”的任何价值作为该叶子的适当孩子。

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

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

相关问题