2017-02-16 3 views
0

안녕하세요 저는 이진 트리에 대한 신속한 알고리즘을 작성하고 있습니다. 내 목표는주어진 깊이에서 노드의 스위프트 이진 트리 목록

여기
func listNodeAt(_n: Int) --> [T] { 

} 

내 나무 클래스

public class BinaryTreeNode<T:Comparable> { 

    //Value and children vars 
    public var value:T 
    public var leftChild:BinaryTreeNode? 
    public var rightChild:BinaryTreeNode? 
    public weak var parent:BinaryTreeNode? 

    //Initialization 
    public convenience init(value: T) { 
     self.init(value: value, left: nil, right: nil, parent:nil) 
    } 

    public init(value:T, left:BinaryTreeNode?, right:BinaryTreeNode?, parent:BinaryTreeNode?) { 
     self.value = value 
     self.leftChild = left 
     self.rightChild = right 
     self.parent = parent 
    } 
} 

처럼 내가 노드의 깊이를 계산하는 도우미 함수를 구축해야 특정 깊이에서 뭔가를 노드의 목록을 만드는 것입니다

//Depth 
    public func depth() -> Int { 
     guard var node = parent else { 
      return 0 
     } 

     var depth = 1 
     while let parent = node.parent { 
      depth = depth + 1 
      node = parent 
     } 

     return depth 
    } 

어떻게하면 원하는 기능을 얻을 수 있습니까? 어떤 제안이라도 대단히 감사합니다. 감사!

+0

그래서 트리의 깊이를 찾는 것과 동일한 알고리즘을 사용하십시오. while 루프에서 배열을 사용하면 항상 배열의 시작 부분에 부모를 삽입합니다. –

+0

감사합니다 좀 더 자세히 설명해 주시겠습니까? 내 깊이 함수는 특정 노트의 깊이를 계산하는 것입니다. –

+0

가능한 모든 노드 목록을 하나의 배열 또는이 깊이를 얻을 수있는 여러 배열에 나열 하시겠습니까? –

답변

2
func listNodeAt(_ n: Int) -> [T] { 
    return getElementsAt(n, node: self) 
} 

private func getElementsAt(_ n: Int, node: BinaryTreeNode<T>, traversingDepth: Int = 0) -> [T] { 
     var array = Array<T>() 
     if traversingDepth < n { 
      if let left = node.leftChild { 
       array = array + getElementsAt(n, node: left, traversingDepth: traversingDepth + 1) 
      } 
      if let right = node.rightChild { 
       array = array + getElementsAt(n, node: right, traversingDepth: traversingDepth + 1) 
      } 
     } else if traversingDepth == n { 
      array.append(node.value) 
     } 
     return array 
    } 

이것은 해결책 중 하나입니다. 여기서 자기가 루트 노드라고 가정합니다.

+0

고마워요. 꽤 좋은 솔루션. 1 질문 루트 노드에서만 함수를 호출해야합니까? (즉, 자기가 루트 노드 여야 함). 우리는 node.parent == nil을 확인해야합니다 –

+0

그래, 근본적으로 루트 노드를 기반으로 한 깊이를 원했기 때문에 위와 같은 추가 검사를 추가하지 않은 것이 이상적입니다. –

+0

당신이 보내는 모든 노드에서 작동합니다. –