#include<iostream>
#include<queue>
#include<cstdio>
#include<stack>
using namespace std;
struct node
{
int value;
node* left;
node* right;
node(int v)
{
value = v;
left = NULL;
right = NULL;
}
};
bool swap_value(node* a, node* b)
{
int tem = a->value;
a->value = b->value;
b->value = tem;
}
void heap_sort_node(node* root, int* tem, int n)
{
queue<node*> tem_queue;
tem_queue.push(root);
int number_node = 1;
while(!tem_queue.empty())
{
node* tem_node = tem_queue.front();
node* left_node = new node(tem[number_node++]);
tem_node ->left = left_node;
tem_queue.push(left_node);
if(number_node >= n)
break;
node* right_node = new node(tem[number_node++]);
tem_node ->right = right_node;
tem_queue.push(right_node);
if(number_node >= n)
break;
tem_queue.pop();
}
}
void downward_adjustment(node* root)
{
if(root->left == NULL )
return ;
else
{
if(root->right != NULL)
{
if(root->left->value <= root->right->value)
{
if(root->left->value < root->value)
{
swap_value(root, root->left);
downward_adjustment(root->left);
}
}
else
{
if(root->right->value < root->value)
{
swap_value(root, root->right);
downward_adjustment(root->right);
}
}
}
else
{
if(root->left->value < root->value)
swap_value(root, root->left);
}
}
}
void adjust_heap(node* root)
{
stack<node*> adjust_node;
queue<node*> tem_queue;
tem_queue.push(root);
while(!tem_queue.empty())
{
node* tem_node = tem_queue.front();
if(tem_node->left != NULL)
{
tem_queue.push(tem_node->left);
adjust_node.push(tem_node);
}
if(tem_node->right != NULL)
tem_queue.push(tem_node->right);
tem_queue.pop();
}
while(!adjust_node.empty())
{
downward_adjustment(adjust_node.top());
adjust_node.pop();
}
}
void level_traversal(node* root)
{
queue<node*> tem_queue;
tem_queue.push(root);
cout<<"*****开始层次遍历*****"<<endl;
while(!tem_queue.empty())
{
node* tem_node = tem_queue.front();
cout<<tem_node->value<<' ';
if(tem_node->left != NULL)
tem_queue.push(tem_node->left);
if(tem_node->right != NULL)
tem_queue.push(tem_node->right);
tem_queue.pop();
}
cout<<endl;
}
int main()
{
int a[8] = {5, 10, 4, 3, 6, 7, 0, -1};
node* root = new node(a[0]);
heap_sort_node(root, a, 8);
cout<<"*****建树成功*****"<<endl;
level_traversal(root);
adjust_heap(root);
level_traversal(root);
//调整堆的方法,将堆顶元素与最后一个元素交换,然后调用downward_adjustment(root)即可。
return 0;
}
利用树的堆排序方法
最新推荐文章于 2022-11-06 07:00:00 发布