利用树的堆排序方法

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值