일반 트리에서 변환 된 이진 트리가 있습니다. 의미, 주어진 노드의 왼쪽 노드는 해당 노드의 하위 노드이고 주어진 노드의 오른쪽 노드는 해당 노드의 형제 노드입니다.Java - 이진 트리에서 노드의 부모 찾기? (일반 트리에서 변환)
제 질문은 - 어떻게 노드를 가져다가 부모를 찾을 수있는 방법을 쓸 수 있습니까? (나는 전체 나무를 횡단하여 추측한다)
감사합니다!
일반 트리에서 변환 된 이진 트리가 있습니다. 의미, 주어진 노드의 왼쪽 노드는 해당 노드의 하위 노드이고 주어진 노드의 오른쪽 노드는 해당 노드의 형제 노드입니다.Java - 이진 트리에서 노드의 부모 찾기? (일반 트리에서 변환)
제 질문은 - 어떻게 노드를 가져다가 부모를 찾을 수있는 방법을 쓸 수 있습니까? (나는 전체 나무를 횡단하여 추측한다)
감사합니다!
올바르게 이해했는지 확인하십시오.
트리 구현에 따라 다릅니다. 일반적으로 트리에는 사이클이 없으며 각 노드에는 자식에 대한 참조가 있습니다. 하지만 다시 한번 이것이 트리의 구현 방법입니다.
리프를 찾고있는 경우 하위가 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;
}
}
}
을 반환 해 주셔서 감사합니다. 하지만 나는 아이를 찾고 있지 않거나 뿌리를 찾고 있습니다. 나는 부모를 찾고 있습니다. 어떻게 그렇게 할 것입니까? – Gambit2007
도움이되기를 바랍니다. 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);
나는 Euler Tour를 사용하여 주어진 노드의 부모를 찾지 않으면 Euler Tour가 게시 한 코드에서 사용되고 있지만 실제로 이해할 수는 없다고 생각합니다. btw, 내 메서드는 노드 1 개만받습니다. 당신과 같은 3 개의 매개 변수가 아니라) 그 부모를 반환합니다. – Gambit2007
도움이 될 것입니다 그
감사합니다! 하지만 이것은 내 방법입니다. public 위치
확인. 위의 버전은 재귀 적입니다. 당신은 명시 적으로 스택을 사용할 반복적으로해야 할 것입니다.Java에는 예를 들어이 링크 http://docs.oracle.com/javase/7/docs/api/java/util/Stack.html –
에서 사용할 수있는 많은 데이터 구조가 있거나 재귀 적으로 수행하려는 경우 단 하나의 매개 변수 만 전달하면 클래스에'Node parent_node' 데이터 변수를 도입해야합니다. 그러면 모든 어린이가 부모가 누구인지 알 수 있으므로 @ lookman의 2 번째 답변의 경우처럼 반환 할 수 있습니다 –
이것은 매우 일반적인 질문입니다. 사용할 노드에 대한 샘플 코드가 있습니까? –
그냥 노드를 객체로 상상해보십시오. Node.hasLeft()와 Node.hasRight()가 유일하게 사용되는 메소드입니다. 둘 다 true 또는 False가 될 수 있습니다. 노드에 왼쪽 노드가있는 경우 해당 노드가 해당 노드임을 나타냅니다. 올바른 노드가 있다면 그 노드가 형제임을 의미합니다. 그것들이 없다면 외부 노드입니다. – Gambit2007
현재 노드에 대한 경로가 포함 된 트리를 탐색하는 동안 목록을 만드는 것이 좋습니다. 그렇게하면 많은 양의 계산 시간을 절약하면서 소량의 메모리를 사용할 수 있습니다. – Jason