逆序数的二叉查找树统计
2009-10-15 09:21
555 查看
逆序数的定义网上有很多,也很容易理解。至于逆序数的统计方法,有两种比较主流,一种是通过归并排序,在归并的过程中统计逆序数。还有一种就是通过二叉查找树逆序数就增加它的父节点+该父节点右孩子的数量,所以在建立二叉查找树时需要记录右孩子的数量,方法是这样,首先将所有元素都初始化为一个节点,节点中有一个值代表右侧孩子结点数量+1,一开始都为1。每次插入一个右孩子,该值就增加1。每插入一个左孩子,逆序数就加上这个值。可能说的有点不太清楚,暂时这样吧。看看代码就清楚了。代码也有点乱:
这个是PKU 1804,最容易的关于逆序数的题目
这个是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; }
相关文章推荐
- POJ2352树状数组入门统计前面有多少个数与求逆序数对类似
- 统计输入中所有单词出现的次数(使用二叉查找树实现:递归和非递归)
- 归并排序(带统计逆序数)
- 逆序数对(inversion)个数统计 python解法与时间复杂度推导
- 二叉查找树(BST)---拷贝 相等判断 查找节点 统计节点 统计层数 判断BST
- Java字符统计并排序
- Matlab统计数组中相同元素的个数
- 一个关于使用 $month,$dayOfMonth 进行按月/日统计的问题
- TopK问题——统计大家最爱玩的游戏
- Oracle 统计今天和今天之前的数量
- 统计单词数
- R数据挖掘技术-基于R语言的数据挖掘和统计分析技术
- 统计学习(五):非参数检验
- [转载]c++经验总结——省教育厅数据统计
- hdu_1251统计难题
- 统计字符
- Android统计表格MPAndroidChart解析
- C语言统计每行的字符数
- 中国互联网网站统计史
- 统计学习笔记——k近邻法与kd树