[英]Swift: Determine nodes in tree
我將我的問題抽象到了一個 Playground 文件中,以便於討論。 我的問題是我需要找出具有最少子節點的樹中節點的所有值。 我沒有得到正確的遞歸。 我的算法的結果是 [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)
你總是只為第一個孩子返回結果:
for child in children{
return valueOfNodes(minNumberOfChildren: minNumberOfChildren, node: child, tempResult: result)
}
相反,您需要將它們結合起來
let childrenResult = children.flatMap { child in
return valueOfNodes(minNumberOfChildren: minNumberOfChildren, node: child, tempResult: [])
}
result.append(contentsOf: childrenResult)
這種方法會扼殺尾遞歸優化,但我認為您不能在這里使用它,因為父級的結果取決於所有子級的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.