先决条件:斐波那契堆(简介)
斐波那契堆是具有最小堆或最大堆属性的树木的集合。在斐波那契堆中,即使所有树都可以是单个节点,树也可以具有任何形状(这不同于二叉树堆,其中每棵树都必须是二叉树)。
在本文中,我们将讨论斐波那契堆上的插入和联合操作。
插入:要将节点插入Fibonacci堆H中,请遵循以下算法:
- Create a new node ‘x’.
- Check whether heap H is empty or not.
- If H is empty then:
- Make x as the only node in the root list.
- Set H(min) pointer to x.
- Else:
- Insert x into root list and update H(min).
例子:
联合:两个斐波纳契堆H1和H2的联合可以按以下方式完成:
- Join root lists of Fibonacci heaps H1 and H2 and make a single Fibonacci heap H.
- If H1(min) < H2(min) then:
- H(min) = H1(min).
- Else:
- H(min) = H2(min).
例子:
以下是一个演示如何在斐波那契堆中进行构建和插入的程序:
C++
// C++ program to demonstrate building
// and inserting in a Fibonacci heap
#include
#include
#include
using namespace std;
struct node {
node* parent;
node* child;
node* left;
node* right;
int key;
};
// Creating min pointer as "mini"
struct node* mini = NULL;
// Declare an integer for number of nodes in the heap
int no_of_nodes = 0;
// Function to insert a node in heap
void insertion(int val)
{
struct node* new_node = (struct node*)malloc(sizeof(struct node));
new_node->key = val;
new_node->parent = NULL;
new_node->child = NULL;
new_node->left = new_node;
new_node->right = new_node;
if (mini != NULL) {
(mini->left)->right = new_node;
new_node->right = mini;
new_node->left = mini->left;
mini->left = new_node;
if (new_node->key < mini->key)
mini = new_node;
}
else {
mini = new_node;
}
}
// Function to display the heap
void display(struct node* mini)
{
node* ptr = mini;
if (ptr == NULL)
cout << "The Heap is Empty" << endl;
else {
cout << "The root nodes of Heap are: " << endl;
do {
cout << ptr->key;
ptr = ptr->right;
if (ptr != mini) {
cout << "-->";
}
} while (ptr != mini && ptr->right != NULL);
cout << endl
<< "The heap has " << no_of_nodes << " nodes" << endl;
}
}
// Function to find min node in the heap
void find_min(struct node* mini)
{
cout << "min of heap is: " << mini->key << endl;
}
// Driver code
int main()
{
no_of_nodes = 7;
insertion(4);
insertion(3);
insertion(7);
insertion(5);
insertion(2);
insertion(1);
insertion(10);
display(mini);
find_min(mini);
return 0;
}
输出:
The root nodes of Heap are:
1-->2-->3-->4-->7-->5-->10
The heap has 7 nodes
Min of heap is: 1