Swift:确定树中的节点

Swift:确定树中的节点,swift,recursion,Swift,Recursion,我把我的问题抽象成一个操场文件,以便于讨论。我的问题是,我需要计算出树中具有最少子节点数的节点的所有值。我没有得到正确的递归。我的算法的结果是[1,9],但应该是[1,3,9]。有什么想法吗 import Foundation class TreeNode{ var children: [TreeNode]? var value: Int init( value: Int, children: [TreeNode]?){ self.value = v

我把我的问题抽象成一个操场文件,以便于讨论。我的问题是,我需要计算出树中具有最少子节点数的节点的所有值。我没有得到正确的递归。我的算法的结果是[1,9],但应该是[1,3,9]。有什么想法吗

import Foundation

class TreeNode{

    var children: [TreeNode]?
    var value: Int

    init( value: Int, children: [TreeNode]?){
        self.value = value
        self.children = children
    }
}

let node11 = TreeNode(value: 11, children: nil)
let node10 = TreeNode(value: 10, children: nil)
let node9 = TreeNode(value: 9, children: [node10, node11])
let node8 = TreeNode(value: 8, children: nil)
let node7 = TreeNode(value: 7, children: [node9])
let node6 = TreeNode(value: 6, children: [node8])
let node5 = TreeNode(value: 5, children:nil)
let node4 = TreeNode(value: 4, children: [node7])
let node3 = TreeNode(value: 3, children: [node5, node6])
let node2 = TreeNode(value: 2, children: [node4])
let node1 = TreeNode(value: 1, children: [node2,node3])
let node0 = TreeNode(value: 0, children: [node1])


func valueOfNodes(minNumberOfChildren: Int, node: TreeNode, tempResult: [Int])->[Int]{

    var result = tempResult

    guard let children = node.children else{
        return result
    }

    if children.count >= minNumberOfChildren{
        result.append(node.value)
    }

    for child in children{
        return valueOfNodes(minNumberOfChildren: minNumberOfChildren, node: child, tempResult: result)
    }

    return result
}


let result = valueOfNodes(minNumberOfChildren: 2, node: node0, tempResult: [])
print(result)

始终仅返回第一个子项的结果:

用于子对象中的子对象{
返回值OfNodes(minNumberOfChildren:minNumberOfChildren,节点:子节点,tempResult:result)
}
相反,你需要把它们结合起来

let childrenResult=children.flatMap{child in
返回节点的值(minNumberOfChildren:minNumberOfChildren,节点:child,tempResult:[]))
}
result.append(内容:childrenResult)

这种方法会扼杀尾部递归优化,但我不认为您可以在这里使用它,因为父级的结果取决于所有子级的结果。

考虑对leaf使用空数组,而不是
nil
。这将使处理节点和消除冗余保护变得更容易。这个例子是对我真正问题的抽象。这就是为什么我添加了一个可选的。