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

Scheme语言实现BST添加节点异常求助:仅返回根节点与null

二叉搜索树tree-add函数修复方案

你的问题出在递归添加节点后没有更新当前节点的子树引用,原函数最后直接返回了原始节点,导致新创建的节点无法挂载到树上。

问题代码的核心缺陷

在(< value x)和(> value x)分支中,你只是递归调用了tree-add处理子树,但没有将递归返回的新子树替换掉原节点的left或right字段,最后直接返回原tree,相当于白做了递归操作,自然无法添加新节点。

修复后的代码

(struct tree-node (val left right) #:transparent)

(define (tree-add tree value)
  (if (null? tree)
      (tree-node value null null)
      (let ([x (tree-node-val tree)])
        (cond
          [(= value x) tree] ; 值已存在,直接返回原节点
          [(< value x)
           ; 创建新节点,保留原val和right,更新left为递归添加后的子树
           (tree-node x (tree-add (tree-node-left tree) value) (tree-node-right tree))]
          [(> value x)
           ; 创建新节点,保留原val和left,更新right为递归添加后的子树
           (tree-node x (tree-node-left tree) (tree-add (tree-node-right tree) value))]))))

测试示例

调用示例:

(define my-tree null)
(set! my-tree (tree-add my-tree 5))
(set! my-tree (tree-add my-tree 3))
(set! my-tree (tree-add my-tree 7))
my-tree ; 输出:(tree-node 5 (tree-node 3 #f #f) (tree-node 7 #f #f))

这样就能正确将新节点挂载到二叉搜索树的对应位置了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:18:36