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

我的BST树AVL校验代码为何无法通过测试?

分析你的AVL树校验代码问题

我帮你梳理下代码里的几个关键问题,这些应该就是导致测试不通过的核心原因:

1. AbsoluteDifference函数的语法与逻辑问题

你的这个函数存在两处明显问题:

  • 语法错误:return语句里多了多余的右括号,((a-b) <= 1))这里多了一个闭合括号,直接会导致编译失败。
  • 逻辑冗余:判断(a-b) <=1 || (b-a) <=1其实等价于判断两数的绝对值差不超过1,但直接用abs(a - b) <= 1更清晰,也不容易出错。

修正后的函数:

bool AbsoluteDifference(int a, int b) {
    return abs(a - b) <= 1;
}

2. 递归辅助函数aux_avl的核心逻辑错误

2.1 空节点的高度定义混乱

AVL树中通常把空节点的高度定义为-1,这样叶子节点的高度就是max(-1, -1) + 1 = 0(如果你习惯叶子节点高度为1,也可以把空节点高度设为0,只要统一规则即可)。但你的代码里,空节点分支执行l_var--,结合递归调用时的l_left = l_var +1,会导致高度计算完全混乱,进而影响高度差的判断。

正确的空节点处理应该是直接赋值:

if (b == NULL) {
    l_var = -1;
    return;
}

2.2 递归调用的高度初始化错误

你在递归左右子树时,把l_left和l_right初始化为l_var +1是完全错误的。每个子树的高度应该独立计算,通过传引用的参数返回结果,不需要手动继承父节点的高度值。

2.3 变量与函数名拼写错误

  • 代码里lvar = max(l_left,l_right);是拼写错误,应该是l_var,这会导致编译错误或未定义行为。
  • 在is_AVL函数中,你调用的auxavl(b,l_var,isAVL);漏了下划线,正确函数名是aux_avl,同样会导致编译失败。

2.4 递归逻辑的完整性问题

你的代码只在isAVL == true时才处理左右子树,但即使左子树已经判定不是AVL,父节点的高度依然需要正确计算,否则后续递归的高度判断会全部出错。

3. 修正后的完整代码

#include <algorithm> // 用于std::max
#include <cstdlib>   // 用于abs函数

// 假设你的BST节点结构定义如下
struct BST {
    int val;
    BST* left;
    BST* right;
    BST(int x) : val(x), left(NULL), right(NULL) {}
};

bool AbsoluteDifference(int a, int b) {
    return abs(a - b) <= 1;
}

void aux_avl(BST* b, int& height, bool& isAVL) {
    if (b == NULL) {
        height = -1;
        return;
    }
    
    int left_height, right_height;
    // 先递归处理左右子树,确保高度计算正确
    aux_avl(b->left, left_height, isAVL);
    aux_avl(b->right, right_height, isAVL);
    
    // 如果已经判定不是AVL树,直接返回当前节点高度即可
    if (!isAVL) {
        height = std::max(left_height, right_height) + 1;
        return;
    }
    
    // 检查当前节点的左右子树高度差
    isAVL = AbsoluteDifference(left_height, right_height);
    // 计算当前节点的高度
    height = std::max(left_height, right_height) + 1;
}

bool is_AVL(BST* b) {
    if (b == NULL) {
        return true;
    }
    int height = 0;
    bool isAVL = true;
    aux_avl(b, height, isAVL);
    return isAVL;
}

额外说明

我调整了递归顺序:先处理左右子树再判断当前节点的合法性,这样即使某一子树已经不符合AVL要求,父节点的高度依然能正确计算,避免后续递归出现连锁错误;同时统一了空节点的高度定义,让整个高度计算逻辑更符合AVL树的标准校验规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:24:36