排序数组构建的BST验证JS代码返回true但LeetCode输出false原因排查
问题原因说明
1. 本地代码返回true是正确结果
你用有序数组二分递归生成的树本身就是合法二叉搜索树:
- 构建逻辑是每次取数组中间元素作为根,左半部分递归生成左子树,右半部分递归生成右子树,天然满足BST左子树所有节点小于根、右子树所有节点大于根的规则
- 你的
isvalidBST函数用中序遍历判断序列严格递增的逻辑完全正确,BST的核心特征就是中序遍历结果为严格升序序列,所以返回true符合预期。
2. LeetCode返回false的核心原因
你大概率是混淆了二叉树的输入格式:
LeetCode的二叉树输入数组是层序遍历的序列化格式,不是直接拿有序数组按二分方式生成树。以你给出的数组[1, 7, 11, 17, 21, 29, 74, 89, 91, 101, 132, 157]为例,按LeetCode的层序反序列化规则生成的二叉树结构如下:
- 根节点是第0位的
1 - 根的左子节点是第1位的
7,右子节点是第2位的11 - 这时候根节点的左子节点
7已经大于根值1,直接违反BST规则,所以验证结果为false。
额外注意点
- 你的
Node构造函数写法有冗余:参数已经定义了left和right的默认值,但函数体内直接写死了this.left = null和this.right = null,会覆盖传入的左右节点,不过你构建树的时候是手动赋值left和right,所以不影响最终生成的树结构。 - 如果是把
isvalidBST函数提交到LeetCode出错,你的代码逻辑本身没有漏洞:用节点对象对比而不是初始化最小值为-Infinity的写法,已经规避了节点值为最小安全整数的边界问题,判断条件node.data <= temp.data也覆盖了重复值的校验,符合LeetCode的BST规则要求。
内容的提问来源于stack exchange,提问作者Nithin Jain
相关产品推荐
相关产品推荐

