您的位置:首页 > 其它

数组中有重复数据统计并按照次数的由大到小排列出来

2012-12-07 12:08 381 查看
此文主要是警醒自己,自己以前也写过此算法的实现,但对比下,发现还是下算法是真正的教科书式经典实现,而且下代码主要由一位MM完成,让我反省了IT行业的性别歧视。

中心思想:遍历数组,依次插入到二叉排序树,如果找到数字相等的,节点的count++;中序遍历算法,输出这个二叉排序树。(PS:如果想得到标准的O(Nlog2N)算法,可以通过旋转树枝的办法,减小树的高度,把二叉排序树优化为平衡二叉树。)

节点类:

package tm.cao.sort;

/**
* 节点类
*
*/
public class TreeNode {

/**
* 关键字
*/
private int data;

/**
* 左子树
*/
private TreeNode leftCh;

/**
* 右子树
*/
private TreeNode rightCh;

/**
* 关键字出现的次数
*/
private int count;
public int getData() {
return data;
}
public TreeNode getLeftCh() {
return leftCh;
}
public TreeNode getRightCh() {
return rightCh;
}
public int getCount() {
return count;
}
public void setData(int data) {
this.data = data;
}
public void setLeftCh(TreeNode leftCh) {
this.leftCh = leftCh;
}
public void setRightCh(TreeNode rightCh) {
this.rightCh = rightCh;
}
public void setCount(int count) {
this.count = count;
}
public TreeNode(int data) {
super();
this.data = data;
this.count=1;
}
public TreeNode(int data, TreeNode leftCh, TreeNode rightCh) {
super();
this.data = data;
this.leftCh = leftCh;
this.rightCh = rightCh;
this.count = 1;
}
public TreeNode() {
super();
}

/* 为了便于调试和输出  生成toString()
*/
@Override
public String toString() {
return "数字=" + data + ", 出现次数=" + count + "";
}

}


二叉排序树的类:

package tm.cao.sort;

import org.junit.Test;

/**
* 二叉排序树的类
*
*/
public class TreeInsert {

/**
* 根节点
*/
private TreeNode root;

public TreeNode getRoot() {
return root;
}

public void setRoot(TreeNode root) {
this.root = root;
}

/**
* 总的方法
*/
public void createTreeAndOutPut(int[] array){
//只需遍历一次数组 遍历的同时插入节点到排序树
for(int data:array){
this.insertNode(data);
}
//中序输出这个排序树
this.middleOrder(root);
}

/**
* 中序遍历 递归算法 p为当前节点的指针
*/
public void middleOrder(TreeNode p){
if(p!=null){
//遍历左子树
this.middleOrder(p.getLeftCh());
//遍历本次节点
System.out.println(p);
//遍历右子树
this.middleOrder(p.getRightCh());
}
}
/**
* 插入单个节点的方法
*/
public void insertNode(int data){
//如果没有根节点 创造新的根节点
if(this.getRoot()==null){
root=new TreeNode(data);
}else{
//初始化指针p指向根节点
TreeNode p=root;
while(true){
//如果p的data小于data
if(p.getData()<data){
//如果p没有左子树  则直接插入到p的左子树
if(p.getLeftCh()==null){
TreeNode leftCh=new TreeNode(data);
p.setLeftCh(leftCh);
break;
}else{
//如果p有左子树 则让指针指向p的左子树 继续遍历
p=p.getLeftCh();
continue;
}
}
//插入右子树的情况 和左子树类似
else if(p.getData()>data){
if(p.getRightCh()==null){
TreeNode rightCh=new TreeNode(data);
p.setRightCh(rightCh);
break;
}else{
p=p.getRightCh();
continue;
}
}else{
//设置重复的情况  不必插入新的节点,直接让p的count加1
int count=p.getCount();
count++;
p.setCount(count);
break;
}
}
}
}

/**
* 用于测试的类  为了程序的健壮性,我们多生成些随机数放入数组
*/
@Test
public void test(){
TreeInsert ti=new TreeInsert();
int[] array={3,47,43,73,86,36,96,47,36,61,46,99,69,81,62,97,74,24,67,62,42,81,14,57,20,42,53,32,37,32,16,76,2,27,66,56,50,26,71,7,32,90,79,78,53,12,56,85,99,26,96,96,68,27,31,5,3,72,93,15,55,59,56,35,64,38,54,82,46,22,31,62,43,9,90};
ti.createTreeAndOutPut(array);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐