题目要求
静态二叉排序平衡树这一完美的结构在数据统计上有着得天独厚的优势。本题要求,从键盘接收一组数据,构造静态二叉排序平衡树,并选择一维数组作为静态二叉排序平衡树的存储结构,为了完成统计工作,每个节点可增设一个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;
}