2017-10-31 2 views
0

여기에 답변이 많지만 스위프트 3+에서 내가 쓴 것을 확인하지 못했습니다.이진 트리를 검색 할 수 있는지 확인하십시오.

func isBST(_ node:Tree) -> Bool { 
    return validNode(node:node, minValue:INT8_MIN, maxValue:INT8_MAX) 

} 

func validNode(node: Tree, minValue:Int32, maxValue:Int32) -> Bool { 

    return node.value > minValue && node.value < maxValue && validNode(node:node.leftChild!, minValue: minValue, maxValue: Int32(node.value)) && validNode(node:node.rightChild!, minValue: Int32(node.value), maxValue: maxValue) 

} 

은 결국 나는 잎을 공격하고 노드가 nil이 될 것입니다 : 아래의 코드를 볼 - 나는 힘이 자식 노드를 풀기에 문제로 실행하는 줄 알았어. 하지만 (그리고 나 자신을 가르치고있어 스위프트 그래서 나와 함께 곰) 나는이 문제를 해결하는 방법을 잘 모르겠습니다. node-node : node.leftChild에 대해 nil coalescing을 수행합니까? 무? 어떤 도움을 주시면 감사하겠습니다.

답변

2

당신은이 노드의 전무 값을 허용하도록 validNode() 함수를 허용하고 그것이 전무 값을 수신 할 때 TRUE를 반환 그래서 리프 노드에 충돌 한

func validNode(node: Tree?, minValue:Int32, maxValue:Int32) -> Bool { 
    guard let node = node else { return true } 
    return node.value > minValue 
     && node.value < maxValue 
     && validNode(node:node.leftChild, minValue: minValue, maxValue: Int32(node.value)) 
     && validNode(node:node.rightChild, minValue: Int32(node.value), maxValue: maxValue) 
} 

시도 할 수 있습니다.

+0

확실히 노드가 nil이면 false를 반환하겠습니까? – Fogmeister

+0

그런 다음 validNode()는 항상 false를 반환합니다. 결국 잎 노드에 도달하고 반환 된 false가 전파됩니다. – Spads

+0

예. 네가 옳아. 내 나쁜 – Fogmeister

관련 문제