关于《在静态二叉排序平衡树上统计数据》问题的一些思考

题目要求

静态二叉排序平衡树这一完美的结构在数据统计上有着得天独厚的优势。本题要求,从键盘接收一组数据,构造静态二叉排序平衡树,并选择一维数组作为静态二叉排序平衡树的存储结构,为了完成统计工作,每个节点可增设一个Sum项,表示该节点为根的子树上的节点数,增设一个Less项,表示值小于等于该根节点值的节点总数(即左子树的节点总数+1)。最终程序的运行结果:任意输入一个区间,均可统计出在这个区间的节点数。

一种契合题意的要求

该方法原理为,先将无序数组排序,再利用二分法存储进数组,利用i,2i,2i+1的关系进行存储
以下为《程序设计中实用的数据结构》
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
此方法完美的契合了题意,但Sum,less值如何应用到统计区间内数据个数却无法解决,在底层子树上sum,less值与区间内节点个数没有确定的规律,以及如果在一个序列中如{1,2,2,2,2,3},如需统计1到3区间内数字,会因排序树中无法统计值相同的元素而错误的统计为1个,但实际为4个数据。

另一种扭曲题意的方法

该方法实现了统计区间内数据,但是所用原理为,将树调平衡后有序存入数组,利用数据有序排放进行统计,实为强行扭曲题意,并未采取一维数组存储(无法从所存储一维数组中提取出树),树也并非静态,同时也未用到题目所要求的Sum,less两属性。


int a[MAX_SIZE];  
void inOrderTraverseAVL(AVLNode* root){  
    AVLNode* stack[MAX_SIZE];  
    int top = -1;  
    int cnt=1;
    AVLNode* p = root;  
    while(p != NULL || top> -1){  
        while ( p!= NULL){  
            stack[++top] = p;  
            p = p->lchild;  
        }  

        p = stack[top--];  

    p->less=cnt;         
    //a数组里顺序存放由小到大的值
    a[cnt]=p->data;
//  printf("%-2d%-2d\n",p->data,cnt);
        p = p->rchild;  
    cnt++;
    }  

}  

//查找在x和y之间的范围的值的个数  
int Count(int x,int y,int n)
{
    int i=1;
    int cnt=0;
    while(i<=n){
        if(y<a[i])
            break;
        else if(a[i]>=x && a[i]<=y)
            cnt++;
        i++;
    }
    return cnt;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值