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

Go泛型二叉树find方法返回二级指针的合理性探讨

泛型二叉树返回二级指针的find方法是否有必要?

结论:这种设计不是仅为演示泛型,而是有实际技术价值——它能让这个查找方法同时服务于「查找节点」和「插入/删除节点」操作,提升代码复用性。下面具体对比两种实现的差异:

1. 功能覆盖范围不同

你的findPointer方法只能完成「找到目标节点(找不到则返回nil)」这单一功能;而findDoublePointer返回的二级指针,指向的是树中某个节点的指针字段(比如根节点指针、父节点的left/right指针):

  • 如果找到目标节点,返回的二级指针指向该节点所在的父节点字段(或根指针)
  • 如果没找到,返回的二级指针指向最后遍历到的nil位置(比如叶子节点的left/right,或空树的root)

这种特性让它能直接用于插入、删除操作,无需额外遍历:

  • 插入时:直接对返回的二级指针赋值*pl = &Node[T]{data: v},就能把新节点挂载到正确位置,不管是插在根节点还是叶子节点的子节点
  • 删除时:找到目标节点对应的二级指针后,直接修改*pl为该节点的左/右子节点,就能完成节点移除,不用额外记录父节点信息

2. 代码复用性差异

findDoublePointer可以作为二叉树所有核心操作的基础工具:

// 基于findDoublePointer实现插入
func (bt *bTree[T]) Insert(v T) {
    pl := bt.findDoublePointer(v)
    if *pl == nil {
        *pl = &Node[T]{data: v}
    }
}

而findPointer只能用于查找,要实现插入/删除,必须重新写一遍遍历逻辑,或者在遍历中额外记录父节点信息,代码冗余度更高。

3. 关于简洁性的取舍

你觉得findPointer更简洁,这没问题——如果你的场景只需要单纯的节点查找,它完全够用。但如果要构建完整的二叉树(支持增删改查),findDoublePointer的复用价值会让整体代码更简洁,避免重复编写相似的遍历逻辑。

另外补充:这种二级指针的写法在Go的链表、树结构实现中很常见,和泛型无关,视频里用它,一方面是演示泛型的用法,另一方面也是展示Go处理这类结构的常用技巧。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:55:25