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

Swift中用struct实现二叉树遇递归存储错误,求解决方案

解决Swift中Struct实现二叉树的递归问题

你遇到的这个错误是因为Swift的struct是值类型——值类型的实例会直接把所有属性的内容嵌入自身内存中。如果你的struct里直接包含BinaryTree类型的left和right属性,就会形成无限递归:每个BinaryTree里都要装两个完整的BinaryTree,而这两个里面又要各装两个,编译器根本无法计算出这个类型的内存大小,所以报错。

下面给你两种实用的struct实现方案:

方案一:使用可选类型(最常用)

二叉树的叶子节点本来就没有左/右子树,所以把left和right改成BinaryTree?(可选类型)就可以解决问题。可选类型对于值类型来说是一个枚举,它要么是nil(没有子树),要么包含一个BinaryTree实例,编译器可以明确计算它的内存大小。

代码示例:

struct BinaryTree {
    var value: Int
    var left: BinaryTree?  // 可选左子树
    var right: BinaryTree? // 可选右子树
}

使用示例

你可以这样创建节点:

// 创建叶子节点(没有子树)
let leafNode = BinaryTree(value: 5, left: nil, right: nil)
// 创建根节点,左子树是上面的叶子节点
let rootNode = BinaryTree(value: 10, left: leafNode, right: nil)

方案二:使用indirect关键字

Swift提供了indirect关键字,它可以让struct的递归属性变成引用语义(底层用指针存储),这样编译器就不用计算无限递归的内存大小了。你可以用它修饰整个struct,或者只修饰递归的属性:

修饰整个struct

indirect struct BinaryTree {
    var value: Int
    var left: BinaryTree
    var right: BinaryTree
}

不过这种写法要求每个节点必须有左、右子树,不太符合常规二叉树的结构(毕竟叶子节点没有子树),所以更实用的是结合可选类型:

struct BinaryTree {
    var value: Int
    indirect var left: BinaryTree?
    indirect var right: BinaryTree?
}

这样既保留了可选子树的灵活性,又用indirect解决了递归值类型的问题。

额外补充:用Class实现(如果不需要Struct的特性)

如果你不需要struct的值语义特性,用class实现二叉树会更直观——因为class是引用类型,天然支持递归结构:

class BinaryTree {
    var value: Int
    var left: BinaryTree?
    var right: BinaryTree?
    
    init(value: Int, left: BinaryTree? = nil, right: BinaryTree? = nil) {
        self.value = value
        self.left = left
        self.right = right
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:29:59