2017-08-15 109 views
0

我有一個樹形結構的實現,如下所示:如何顯示樹節點的當前位置

class Node { 

    let value: String 

    var parentNode: Node? 
    var childenNode = [Node]() 

    func appendNode(node: Node) { 
     childenNode.append(node) 
     node.parentNode = self.parentNode 
    } 

    func isLeaveNode(node: Node) -> Bool{ 
     if node.childenNode.isEmpty { 
      return true 
     } else { 
      return false 
     } 
    } 

    init(value: String) { 
     self.value = value 
    } 
} 

我想有返回它採取了路徑的函數來獲取到當前節點。例如:假設我有一個離開節點node,並且到達該離開節點所用的路徑爲Main Menu -> Setting -> User Options -> Set User Options,那麼我需要一個返回該路徑的函數:例如, func path(node: Node) -> path。我如何實現?

我試過用for-in循環來循環父節點。但是,由於Node不符合sequence協議,因此無法完成。

謝謝堆!任何幫助將不勝感激!

+0

只是環回父節點,直到父節點是零 –

+0

是的,我已經試過了,但由於節點不符合'sequence'協議,這是不可能的 –

+0

嘗試這樣的事: 'FUNC path(node:Node) - > [Node] {return path.parentNode == nil? [self]:path(node:parentNode!)+ [self]}' –

回答

1

,直到它到達根這樣可以定義使用parentNode通過節點遞歸地迭代的函數:

func getPath()->[Node]{ 
    return self.parentNode == nil ? [self] : [self] + self.parentNode!.getPath() 
} 

我測試使用以下示例:

let grandParent = Node(value: "grand") 
let parent = Node(value: "parent") 
parent.parentNode = grandParent 
let child = Node(value: "child") 
child.parentNode = parent 
child.getPath() //returns [grandParent, parent, child] 

三元運算符在功能上只是速記

func getPath()->[Node]{ 
    if self.parentNode == nil { 
     return [self] 
    } else { 
     return [self] + self.parentNode!.getPath() //this is the recursive call 
    } 
} 

self.parentNode == nil意味着我們找到了根節點,所以這是遞歸調用的基本情況,我們只需要返回當前值。如果是self.parentNode != nil,則表示我們處於子節點,所以返回值將是當前節點的數組+遞歸調用的結果。

+0

謝謝!工作,但我想更好地理解你的代碼,你可以重新編寫代碼,使它不在一行嗎?非常感謝 –

+0

@BrendonCheung我更詳細地解釋了它,但這是遞歸之美,你可以寫出真正簡單的調用。三元運算符可以保存一些行,但即使沒有,該功能也非常簡單。 –

+0

美麗,謝謝! –

0

如果遞歸對您來說是新的,您也可以嘗試迭代方法。遵循大衛的回答。

func getPath() -> [Node] { 
    var currentNode = self 
    var path: [Node] = [] 
    while currentNode != nil { 
    path += [currentNode] 
    currentNode = currentNode.parentNode 
    } 
    return path 
} 
+0

非常感謝! –