2013-02-16 1 views
1

이진 트리에서 주어진 노드의 조상 (상위 부모)을 인쇄하는 비 재귀 프로그램을 작성해야합니다. 어떤 논리를 사용해야합니까?이진 트리 : 이진 트리에서 노드의 조상을 인쇄하는 비 반복적 루틴?

+1

먼저 BST에 대해 위의 작업을 수행하려고했습니다. 그런 다음 어떤 식 으로든 이진 트리의 논리를 확장 할 수 있을지 생각했습니다. 하지만 그 논리는 비 재귀 루틴을 위해 보유하지 않습니다. BST를위한 논리 : 무한 루프에서 루트 포인터가 노드의 상위 노드임을 확인하거나 노드가 BST에 존재하지 않으면 null을 반환 할 때까지 루트 포인터를 계속 업데이트합니다. –

+0

또는 자식 노드가 부모 노드에 대한 참조를 보유하도록 BST를 수정하십시오 ... – nhahtdh

+0

@nhahtdh 제안이 조금도 모호하여 사용하기가 어렵습니다. 귀하의 요점을 더 잘 설명 할 수있는 링크가 있습니까? –

답변

2

사용 비 재귀 서브 루틴 (이진 트리를 탐색하는 조각 아래의 [2] 마지막 두 단계를 기억하는 포인터의 배열을 사용하여 http://en.wikipedia.org/wiki/Tree_traversal#Implementations 참조) 스택에 모든 부모 노드를 저장하고 스택에서 팝업 할 때마다 스택에서 요소를 적절하게 팝합니다. 마지막으로 요소를 찾으면 스택의 두 번째 최상위 요소가 조상이됩니다.

2

조부모 노드에 도달하면 반복 구현 중 하나를 사용하고 (node.Left.Left = desired OR node.Left.Right = desired 또는 node.Right.Left = desired OR node.Right.Right = 원하는). 먼저 후보 노드에 실제로 손주가 있음을 테스트해야합니다.

1

표준 트리 워크를 수행하고 제한된 스택처럼 마지막 두 단계를 기억할 수 있습니다. ("OPA"는 "할아버지"에 대한 네덜란드 참고) :

#include <stdio.h> 
#include <stdlib.h> 

struct tree_node { 
    struct tree_node * left; 
    struct tree_node * right; 
    int data; 
}; 

     /* a bonsai-tree for testing */ 
struct tree_node nodes[10] = 
/* 0 */ {{ nodes+1, nodes+2, 10} 
/* 1 */ ,{ nodes+3, nodes+4, 5} 
/* 2 */ ,{ nodes+5, nodes+6, 17} 
/* 3 */ ,{ nodes+7, nodes+8, 3} 
/* 4 */ ,{ nodes+9, NULL, 7} 
/* 5 */ ,{ NULL, NULL, 14} 
/* 6 */ ,{ NULL, NULL, 18} 
/* 7 */ ,{ NULL, NULL, 1} 
/* 8 */ ,{ NULL, NULL, 4} 
     }; 

struct tree_node * find_opa(struct tree_node *ptr, int val) 
{ 
struct tree_node *array[2] = {NULL,NULL}; 
unsigned step=0; 

for (step=0; ptr; step++) { 
     if (ptr->data == val) break; 
     array[ step % 2] = ptr; 
     ptr = (val < ptr->data) ? ptr->left : ptr->right; 
     } 

return ptr ? array[step %2] : NULL; 
} 

void show(struct tree_node *ptr, int indent) 
{ 
if (!ptr) { printf("Null\n"); return; } 

printf("Node(%d):\n", ptr->data); 
printf("%*c=", indent, 'L'); show (ptr->left, indent+2); 
printf("%*c=", indent, 'R'); show (ptr->right, indent+2); 
} 

int main(void) 
{ 
struct tree_node *root, *opa; 

root = nodes; 
show (root, 0); 

opa = find_opa(root, 4); 
printf("Opa(4)=:\n"); 
show (opa, 0); 
return 0; 
} 
+0

분재 나무 란 무엇입니까? 그것은 특정한 유형의 나무입니까? –

+0

그것은 아름다움 때문에 만 존재하는 작은 나무입니다. – wildplasser

+0

또한 코드는 이진 검색 트리에서만 작동합니다. 일반 트리에 잘 맞는 코드를 가지고 있습니까 (이 질문은 이진 트리의 일반적인 구현을 요구합니까)? –