You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言二叉搜索树高效范围遍历优化方案求助

二叉搜索树范围查询优化方案

核心优化思路

利用二叉搜索树(BST)的特性:左子树节点值均小于当前节点,右子树节点值均大于当前节点。通过判断当前节点与上下界的关系,跳过不必要的子树遍历,大幅减少访问节点的数量。

优化后代码实现

// n - 当前节点
// l - 结果累加列表
static void doTreeSearchBetween(Tree t, Node n, Record lower,
                                Record upper, List l) {
    if (n == NULL) {
        return;
    } 

    int cmpLower = t->compare(n->rec, lower);
    int cmpUpper = t->compare(n->rec, upper);

    // 仅当当前节点 >= 下界时,左子树才可能存在符合条件的节点
    if (cmpLower >= 0) {
        doTreeSearchBetween(t, n->left, lower, upper, l);
    }

    // 当前节点在范围内则加入结果列表
    if (cmpLower >= 0 && cmpUpper <= 0) {
        ListAppend(l, n->rec);
    }

    // 仅当当前节点 <= 上界时,右子树才可能存在符合条件的节点
    if (cmpUpper <= 0) {
        doTreeSearchBetween(t, n->right, lower, upper, l);
    }
}

关键逻辑说明

  • 左子树遍历判断:如果当前节点值小于下界(cmpLower < 0),其左子树所有节点值必然更小,不可能落在查询范围内,直接跳过左子树遍历。
  • 右子树遍历判断:如果当前节点值大于上界(cmpUpper > 0),其右子树所有节点值必然更大,不可能落在查询范围内,直接跳过右子树遍历。
  • 结果顺序一致性:保留原中序遍历的执行顺序(符合条件的左子树→当前节点→符合条件的右子树),保证结果列表与原全遍历的输出顺序一致(升序排列)。

效果验证

以你提供的测试用例为例:

Inserting: 11 13 17 19 23 29 31 37 41 43
Searching between 10 and 20
Search returned: 11 13 17 19

优化后会直接跳过23及后续的右子树节点,仅访问11、13、17、19及其空左子树,访问节点数大幅减少。

内容的提问来源于stack exchange,提问作者FreeAntiVirus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:15:36