// see binarytrees.swift for original import Dispatch import Foundation class TreeNode { var left, right: TreeNode? init(left: TreeNode?, right: TreeNode?) { self.left = left self.right = right } func check() -> Int { if left != nil { return left!.check() + right!.check() + 1 } else { return 1 } } } func createTree(_ depth: Int) -> TreeNode? { if depth > 0 { let node = TreeNode(left: createTree(depth-1), right: createTree(depth-1)) return node } else { let node = TreeNode(left: nil, right: nil) return node } } let n: Int if CommandLine.argc > 1 { n = Int(CommandLine.arguments[1]) ?? 10 } else { n = 10 } let minDepth = 4 let maxDepth = (n > minDepth + 2) ? n : minDepth + 2 // Create big tree in first pool let tree = createTree(maxDepth+1) let check = tree!.check() print("stretch tree of depth \(maxDepth+1)\t check: \(check)") // Cleal first pool and allocate long living tree let longLivingTree = createTree(maxDepth) // Allocate binary trees of increasing depth up to maxDepth depth for currentDepth in stride(from: minDepth, through: maxDepth, by: 2) { let iterations = 1 << (maxDepth - currentDepth + minDepth) var totalChecksum = 0 for _ in 1...iterations { let tree1 = createTree(currentDepth) totalChecksum += tree1!.check() } print("\(iterations)\t trees of depth \(currentDepth)\t check: \(totalChecksum)") } // Check long living tree and print out check info print("long lived tree of depth \(maxDepth)\t check: \(longLivingTree!.check())")