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
相关产品推荐
相关产品推荐

