2014-10-16 6 views
0

일반 트리에서 변환 된 이진 트리가 있습니다. 의미, 주어진 노드의 왼쪽 노드는 해당 노드의 하위 노드이고 주어진 노드의 오른쪽 노드는 해당 노드의 형제 노드입니다.Java - 이진 트리에서 노드의 부모 찾기? (일반 트리에서 변환)

제 질문은 - 어떻게 노드를 가져다가 부모를 찾을 수있는 방법을 쓸 수 있습니까? (나는 전체 나무를 횡단하여 추측한다)

감사합니다!

+1

이것은 매우 일반적인 질문입니다. 사용할 노드에 대한 샘플 코드가 있습니까? –

+0

그냥 노드를 객체로 상상해보십시오. Node.hasLeft()와 Node.hasRight()가 유일하게 사용되는 메소드입니다. 둘 다 true 또는 False가 될 수 있습니다. 노드에 왼쪽 노드가있는 경우 해당 노드가 해당 노드임을 나타냅니다. 올바른 노드가 있다면 그 노드가 형제임을 의미합니다. 그것들이 없다면 외부 노드입니다. – Gambit2007

+0

현재 노드에 대한 경로가 포함 된 트리를 탐색하는 동안 목록을 만드는 것이 좋습니다. 그렇게하면 많은 양의 계산 시간을 절약하면서 소량의 메모리를 사용할 수 있습니다. – Jason

답변

0

올바르게 이해했는지 확인하십시오.

트리 구현에 따라 다릅니다. 일반적으로 트리에는 사이클이 없으며 각 노드에는 자식에 대한 참조가 있습니다. 하지만 다시 한번 이것이 트리의 구현 방법입니다.

리프를 찾고있는 경우 하위가 null 인 기본 사례에 도달 할 때까지 노드의 하위 노드로 계속 순환 할 수 있습니다.

findLeaves (Node n) { 
    if (n == null) 
    return; 
    else if (n.left == null AND n.right == null) 
    return n; // A child 
    else 
    findLeaves(n.left); 
    findLeaves(n.right); 

} 

루트와 동일합니다. 노드가 parent에 대한 참조를 가지고 있고 루트를 찾고 있다면. 부모가 null이 될 때까지 부모에게 반복을 계속합니다. 이는 노드가 부모임을 의미합니다.

findRoot (Node n) { 
    if (n == null) 
    return; 
    else if (n.parent == null) 
    return n; // A root 
    else 
    findRoot(n.parent); 

} 

난 당신이 '가치'정수 변수를 포함하는 노드 클래스가있는 경우이 당신에게

private static BinaryNode getParent(AnyType x, BinaryNode<AnyType> t, BinaryNode<AnyType> parent) { 
     if (t == null) { 
      return null; 
     } else { 
      if (x.compareTo(t.element) < 0) { 
       return getParent(x, t.left, t); 
      } else if (x.compareTo(t.element) > 0) { 
       return getParent(x, t.right, t); 
      } else { 
       return parent; 
      } 
     } 
    } 
+0

을 반환 해 주셔서 감사합니다. 하지만 나는 아이를 찾고 있지 않거나 뿌리를 찾고 있습니다. 나는 부모를 찾고 있습니다. 어떻게 그렇게 할 것입니까? – Gambit2007

0

도움이되기를 바랍니다. sudo 코드는 다음과 같이 쓸 수 있습니다.

Node find_parent(Node currentNode, Node parentNode, int valueOfChildNode) { 
    Node finalNode = null; 
    if (currentNode->value == valueOfChildNode) return parentNode; 
    if (currentNode->left_child) 
      finalNode = find_parent(currentNode->left_child,valueOfChildNode,currentNode); 
    if (!finalNode && currentNode->right_child) 
      find_parent(currentNode->right_child,valueOfChildNode,currentNode); 
    return finalNode; 
} 

사용자 요구 사항에 따라 변경할 수 있습니다. 아래의 예와 같이 호출 할 수 있습니다.

find_parent(binaryTree->root_node, null, 15);

+0

나는 Euler Tour를 사용하여 주어진 노드의 부모를 찾지 않으면 Euler Tour가 게시 한 코드에서 사용되고 있지만 실제로 이해할 수는 없다고 생각합니다. btw, 내 메서드는 노드 1 개만받습니다. 당신과 같은 3 개의 매개 변수가 아니라) 그 부모를 반환합니다. – Gambit2007

0

도움이 될 것입니다 그

+0

감사합니다! 하지만 이것은 내 방법입니다. public 위치 parent (위치 v) 여기서 "v"는 부모를 찾고 반환해야하는 노드이므로 그에 따라 코드를 어떻게 수정합니까? – Gambit2007

+0

확인. 위의 버전은 재귀 적입니다. 당신은 명시 적으로 스택을 사용할 반복적으로해야 할 것입니다.Java에는 예를 들어이 링크 http://docs.oracle.com/javase/7/docs/api/java/util/Stack.html –

+0

에서 사용할 수있는 많은 데이터 구조가 있거나 재귀 적으로 수행하려는 경우 단 하나의 매개 변수 만 전달하면 클래스에'Node parent_node' 데이터 변수를 도입해야합니다. 그러면 모든 어린이가 부모가 누구인지 알 수 있으므로 @ lookman의 2 번째 답변의 경우처럼 반환 할 수 있습니다 –

관련 문제