2016-07-22 76 views

回答

4

這是與你的頭攪亂的遊樂場。

遊樂場正在爲具有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 
+0

謝謝@Alain T ..關於鏡像函數,其要點是關於在不使用遞歸的情況下實現它,所以這就是爲什麼:D –

相關問題