왼쪽 자식 오른쪽 형제 트리에서 노드 N의 부모를 찾고 싶습니다. 나무는 아이들을 주문했고 아이들의 수에는 제한이 없습니다.왼쪽 자식 오른쪽 형제 트리에서 노드의 부모를 찾는 방법은 무엇입니까?
Node getParent(Node n)
{
....
return parent;
}
정말 도움이 필요합니다. 직접 찾을 방법이 없기 때문에 도움이 필요합니다.
답변은 의사 코드 또는 프로그래밍 언어 일 수 있습니다.
왼쪽 자식 오른쪽 형제 트리에서 노드 N의 부모를 찾고 싶습니다. 나무는 아이들을 주문했고 아이들의 수에는 제한이 없습니다.왼쪽 자식 오른쪽 형제 트리에서 노드의 부모를 찾는 방법은 무엇입니까?
Node getParent(Node n)
{
....
return parent;
}
정말 도움이 필요합니다. 직접 찾을 방법이 없기 때문에 도움이 필요합니다.
답변은 의사 코드 또는 프로그래밍 언어 일 수 있습니다.
루트에서 시작하여 마지막으로 분기 한 시간을 기억하여 검색하십시오. 키를 찾으면 마지막으로 왼쪽에서 가져온 노드가 부모 노드입니다. 왼쪽 분기를 가져 가면 부모가 없습니다.
BTW 상기 Wikipedia definition
좌측 아이 오른쪽 형제 이진 트리는 K 진 트리의 이진 트리의 표현이다. 1 k-ary 트리에서 LC-RS 이진 트리로 변환하는 프로세스 (Knuth transform 2라고도 함)는 일반적으로 추가 정보없이 되돌릴 수 없습니다.
추가 정보없이 은 일반적으로 되돌릴 수 없습니다 구절은 무엇을 당신이하려고하는 것은 불가능하다는 것을 의미한다.그러나 나는 동의하고, 그래서 여기에
변환이 되돌릴 수 있는지 여부에 관계없이 노드는 분명히 고유 한 부모를가집니다. 부모가 없으면 나무에 없을 것입니다. 부모가 둘 이상인 경우 데이터 구조는 트리가 아닙니다. –
물론, 루트가 아닌 다른 모든 노드에는 부모가 있습니다. 질문은 : 그것이 확인 될 수 있는가? 항상 식별 할 수 있다면 원래의 트리를 항상 재구성 할 수 있으며, 변환이 반전됩니다. 즉, 위키 피 디아 문서가 올바르지 않습니다. –
리플렉션에서는이 컨텍스트에서 기사가 잘못되었다고 생각합니다 (내 "시도해 볼 수 있습니다"는 맞습니다). 나는 내 대답을 편집하고 있습니다. 이것에 대한 자세한 설명은 http : //en.wikipedia를 참조하십시오.org/wiki/Talk % 3ALeft_child-right_sibling_binary_tree –
this Wikipedia discussion page 내 대답은하지만 많은 경우에서 테스트되지 않지만 여기
traverse(rootofthistree, NULL, integerWearlookingfor);
방법처럼 당신은 트래버스 함수가 호출
struct node{
node* left;
node* right;
int i;
node(int _i,node* _left,node* _right){
i=_i;
left = _left;
right = _right;
}
};
node* traverse(node* root,node* parent, int y){
if(root == NULL) return NULL;
if(root->i == y) return parent;
node* result = traverse(root->left,root,y);
if(result) return result;
result = traverse(root->right, parent , y);
if(result) return result;
return NULL;
}
아이디어를 얻을 수 있습니다 귀하의 데이터 구조를 이해합니다 :
node.left
은중 하나입니다. (node
먼저 형제 인 경우) (node
트리의 루트 인 경우)
node
가없는 경우 첫 번째 형제)null
는node.right
중 하나입니다 :
node
이 마지막 형제가 아닌 경우)null
(node
마지막 형제 인 경우) node.child
node
은 아이가있는 경우)null
node
나무 잎 인 경우)
그러면 노드 N
의 부모를 다음 알고리즘을 통해 얻을 수 있습니다.
node* get_parent(node* N)
{
//define parent of nullptr to be nullptr
if (!N)
return nullptr;
while (true)
{
if (N->left)
{
//N->left is either the previous sibling or the parent
if (N->left->child == N) //N->left is the parent
return N->left;
else //N->left is the previous sibling
N = N->left;
}
else //a node with left==nullptr is the root, so its parent is nullptr
{
return nullptr;
}
}
}
부모를 찾으려고하는 노드를 알고 있습니까? 이제 당신이해야 할 부모 참조가 있다면, 노드를 찾는다 (find). 그리고 그것으로부터 모든 그레이비가있다. – ChiefTwoPencils
아니요 숙제에 대한 부모 참조가 없어서 그게 바뀌지 않습니다 ... 그래서 나무의 뿌리를 아는 부모를 찾아야합니다. – Berseker117
아니요, 나는 아이들이 항상 주문된다는 것을 알고 있습니다 ... – Berseker117