用二叉排序树求解逆序数

本文代码为自己所写,思路参照博文:http://www.cppblog.com/myjfm/archive/2012/09/15/190772.html

#include<iostream>
using namespace std;
struct BST
{
	int value;//数
	int num_right_subtree;//右子树中结点个数
	BST* Left;
	BST* Right;
	BST(int num)//构造函数
	{
		value=num;
		num_right_subtree=0;
		Left=NULL;
		Right=NULL;
	}
};
int Build_tree(BST *root,int num)
{
	int num_of_inversions=0;
	BST *temp=new BST(num);
	while(root)
	{
		if(temp->value<root->value)
		{
			num_of_inversions+=root->num_right_subtree+1;
			if(root->Left==NULL)
			{
				root->Left=temp;
				break;
			}
			else
				root=root->Left;
		}
		else
		{
			root->num_right_subtree++;
			if(root->Right==NULL)
			{
				root->Right=temp;
				break;
			}
			else
				root=root->Right;
		}
	}
	return num_of_inversions;
}
void Release_tree(BST *root)
{
	if(root)
	{
		Release_tree(root->Left);
		Release_tree(root->Right);
	}
	delete root;
}
void pre_traversal(BST *root)
{
	if(root)
	{
		pre_traversal(root->Left);
		cout<<root->value<<' ';
		pre_traversal(root->Right);
	}
}
int main()
{
	int n;
	int *tt;
	int i;
	int N_inversions;
	while(cin>>n && n>0)
	{
		N_inversions=0;
		tt=new int[n];
		cin>>tt[0];
		BST *root=new BST(tt[0]);
		for(i=1;i<n;i++)
		{
			cin>>tt[i];
			N_inversions+=Build_tree(root,tt[i]);
		}
		pre_traversal(root);
		cout<<endl;
		cout<<"The number of inversions is :"<<N_inversions<<endl;
		Release_tree(root);
		delete []tt;
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值