我想知道如何在堆和根元素的链接结构实现中找到最远的元素。我希望能够使用Enque和Deque元素。
一些澄清: 我的意思是假设你有一个构成最大堆的链接结构(根元素具有最大值)。您的树将在最底部的某个位置放置一个元素,您可以在插入或移除之后插入,具体取决于您是否正在进行排队或取消。你如何确定这个元素?以及如何确定树的根节点? (最重要的一个)
答案 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的新叶子。
关于如何找到根的问题 - 通常根是指向您保留的树的唯一指针。这是所有操作的起点。如果你从其他地方开始,我想你可以导航到根目录,但我会质疑为什么。