您的位置:首页 > 其它

逆序数的二叉查找树统计

2009-10-15 09:21 567 查看
逆序数的定义网上有很多,也很容易理解。至于逆序数的统计方法,有两种比较主流,一种是通过归并排序,在归并的过程中统计逆序数。还有一种就是通过二叉查找树逆序数就增加它的父节点+该父节点右孩子的数量,所以在建立二叉查找树时需要记录右孩子的数量,方法是这样,首先将所有元素都初始化为一个节点,节点中有一个值代表右侧孩子结点数量+1,一开始都为1。每次插入一个右孩子,该值就增加1。每插入一个左孩子,逆序数就加上这个值。可能说的有点不太清楚,暂时这样吧。看看代码就清楚了。代码也有点乱:

这个是PKU 1804,最容易的关于逆序数的题目

#include <iostream>
#include <vector>
#include<string>
#include<map>

class treenode
{
public:
treenode(int val=0):value(val),reverse(1),leftc(NULL),rightc(NULL){}
int value;
int reverse;
void setleftc(treenode * lc){leftc=lc;}
void setrightc(treenode * rc){rightc=rc;}
void increaseval(){reverse++;}
treenode * getleftc(){return leftc;}
treenode * getrightc(){return rightc;}

private:
treenode *leftc;
treenode *rightc;
};

using namespace std;
int traveltree(treenode *p)
{
static int val=0;
if(p!=NULL)
{
val+=p->reverse;
cout << p->reverse <<endl;
}

else
return 0;
traveltree(p->getleftc());
traveltree(p->getrightc());
return val;
}

void releasetree(treenode *p)
{
if(p==NULL)
return;
releasetree(p->getleftc());
releasetree(p->getrightc());
delete p;
}
int reversecount(vector<int> & num)
{
if(num.size()<2)
return 0;
treenode *root=new treenode(num[0]),*pthis,*plast,*p;
int length=num.size();
int i=1;
int count=0;
while(i<length)
{
pthis=plast=root;
p=new treenode(num[i]);
while(pthis!=NULL)
{
plast=pthis;
if(p->value>=pthis->value)
{
pthis->increaseval();
pthis=pthis->getrightc();
}
else
{
count+=pthis->reverse;
pthis=pthis->getleftc();

}
}
if(p->value>=plast->value)
plast->setrightc(p);
else
plast->setleftc(p);
i++;
}

releasetree(root);
return count;
}

int main()
{
int N;
cin >> N;
vector<int> num;
int singlenum;
int i=1;
int flag=0;
char getin;
while(N--)
{
num.clear();
do
{
cin >> singlenum;
if(flag!=0)
{
num.push_back(singlenum);
}
flag=1;
getin=cin.get();
}while(getin!='/n');
flag=0;
singlenum=reversecount(num);
cout <<"Scenario #"<<i<<":"<<endl;
cout << singlenum <<endl;
cout <<endl;
i++;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: