- 论坛徽章:
- 15
|
本帖最后由 yulihua49 于 2012-08-04 22:56 编辑
OwnWaterloo 发表于 2012-04-21 18:04
bst_t* bst_upper(bst_t** t, ptrdiff_t cmp(void* e, void* k), void* k) {
bst_t* bound = bst_max(t);
bst_t* middle = bound->p[0]//找到正根
while (middle)
cmp(middle,k) <= 0
? middle = middle->p[1]
: (bound = middle, middle = middle->p[0]);
return bound;
}
...
边界哨兵还是去掉吧,找不到就是NULL别给人家错误的结果。
我的需求与STL稍有差异,不是重码,而是在一个序列中找到>,>=.<,<= 的值。下面的程序多简单,一次搜索定乾坤,而且肯定是最短路径。不需要父节点(平衡树,平衡旋转时带爹不好转),也没必要搞个边界什么的,没有符合条件的,返回NULL即可。否则,我要求这个树既有>也有<,你还弄两个边界不成?- T_Tree * BB_Tree_GT(T_Tree *sp,void *content_key,int len,
- int (*Cmp_rec)(void *s1,void *s2,int len))
- {//比K大的最小节点
- T_Tree *t;
- return !sp?sp:(0>=Tree_Cmp(sp->Content,content_key,len,Cmp_rec))?
- BB_Tree_GT(sp->Right,content_key,len,Cmp_rec)://一直往右,肯定NULL
- (t=BB_Tree_GT(sp->Left,content_key,len,Cmp_rec))?t:sp;//只要向左,必有结果。
- }
复制代码 这已经是生产中使用的程序了,而且使用频度很高,所以非常注重效率。
|
|