這是與你的頭攪亂的遊樂場。
遊樂場正在爲具有CustomStringConvertibe協議的變量(可能要在右側面板上提供信息)計數自己的調用。
如果您只是在沒有打印的情況下調用鏡像(樹),就可以看到這一點。
如果算上使用自己的計數器調用的實際數量,它會給一個非常不同的結果:
var descCount = 0
extension Node: CustomStringConvertible {
var description: String
{
descCount += 1
return "id: \(id)\nleft: \(left)\nright: \(right)"
}
}
descCount = 0
print(tree)
descCount // 12
descCount = 0
print(mirror(tree))
descCount // 12
順便說一句,我有一個小麻煩了解鏡()函數和我想通遞歸的可能會更容易理解。如何添加鏡像()函數來節點:
func mirror() -> Node
{
let result = Node()
result.id = id
result.left = right?.mirror()
result.right = left?.mirror()
return result
}
print(tree.mirror())
[編輯]這裏的一個非遞歸鏡功能(相同的邏輯你的)具有稍微更清晰的結構:
func mirror2(tree:Node) -> Node
{
// will return top of mirrored tree
let newTree = Node()
// node pair used for traversal and duplication
var original:Node! = tree
var mirrored:Node! = newTree
// traversal of tree structure left side first
// (uses mirrored tree to keep track of traversed nodes)
while original != nil
{
// carry node identifier (and contents eventually)
mirrored.id = original.id
// downwards, mirror left side first (if not already done)
if (original.left == nil) != (mirrored.right == nil)
{
original = original.left
mirrored.right = Node()
mirrored = mirrored.right
continue
}
// downwards, mirror right side second (if not already done)
if (original.right == nil) != (mirrored.left == nil)
{
original = original.right
mirrored.left = Node()
mirrored = mirrored.left
continue
}
// upwards from leaves and completed branches
original = original.parent
mirrored = mirrored.parent
}
return newTree
}
和一些視覺糖果爲樹的描述:
extension Node: CustomStringConvertible
{
var indent:String
{ return " " + (parent?.indent ?? "") }
var description: String
{
return "\(id)\n"
+ (left != nil ? "\(indent)L:\(left!)" : "")
+ (right != nil ? "\(indent)R:\(right!)" : "")
}
}
導致結果的便於比較:
print(tree)
// 0
// L:1
// L:3
// L:7
// R:8
// R:4
// L:9
// R:10
// R:2
// R:6
// L:13
// R:14
//
print(mirror2(tree))
// 0
// L:2
// L:6
// L:14
// R:13
// R:1
// L:4
// L:10
// R:9
// R:3
// L:8
// R:7
謝謝@Alain T ..關於鏡像函數,其要點是關於在不使用遞歸的情況下實現它,所以這就是爲什麼:D –