2016-08-29 5 views
-5

지금부터는 책에서 데이터 구조를 배우고 있습니다. 완전한 이진 트리의 경우 배열에 저장할 수 있습니다. 하지만 알고리즘을 만들 수 없으며 배열을 완전한 이진 트리로 변환 할 수도 없습니다. 누구든지 C에서 이걸 도와 줄 수 있니? 이 질문은 재귀에서 해결할 수 있다고 생각합니다. 이진 트리를 순회하는 것과 같지만, 그것을 수행 할 수는 없으며 비 재귀 방법으로도 해결할 수 있습니다.완전한 이진 트리를 배열에 저장하는 알고리즘

+0

에 오신 것을 환영합니다 : @ 피터 Skarpetis에 의해 지적, 당신은 전역 또는 static의 함수에 포인터 후 추가 매개 변수를 전달을 사용하지 않도록 할 수 있습니다! 지금까지 연구/디버깅 노력을 보여주십시오. 먼저 [Ask] 페이지를 읽으십시오. –

+0

https://en.wikipedia.org/wiki/Binary_heap#Heap_implementation –

+0

@PeteKirkham을 참조하십시오. 나에게 좋은 방향을 보여주었습니다. 지금 검색하는 방법을 알고 있습니다. :) – JiangFeng

답변

1

함수 포인터를 호출하는 순서 순회 (traversal In-Order) 함수가 필요합니다.

편집 : 스택 오버플로

struct container { 
    void *data; 
    int count; 
}; 

void tree_walk_recurse(const t_node *node, void (*func)(void *, void *), void *data) 
{ 
    if (node->left) tree_walk_recurse(node->left, func, data); 
    func(node->data, data); 
    if (node->right) tree_walk_recurse(node->right, func, data); 
} 

void tree_walk(const t_node *root, void (*func)(void *, void), void *data) 
{ 
    if (root && func) tree_walk_recurse(root, func, data); 
} 

void insert(void *data, void *ptr) 
{ 
    struct data *array = ptr; 

    array->data[array->count++] = data; 
} 

/* Traverse in-order using insert */ 
struct container array; 

array.data = malloc(sizeof(struct data) * n); 
array.count = 0; 
tree_walk(root, insert, &array); 
+1

함수 insert에는 더 많은 매개 변수가 필요합니다. 배열의 삽입 위치에 대한 포인터 일 수 있으므로 * ptr = data를 수행 할 수 있습니다. –

+0

@PeterSkarpetis, 네 말이 맞아!, 편집 –

+0

@AlterMann 대단히 고마워.하지만 분명히 표현하지 않은 것 같아. 나는 배열에 완전한 바이너리를 저장해야한다고 생각하는 순서대로 함수를 사용해서는 안된다. A [1]의 저장소 루트이고, A [2]의 큰 아들, A [3]의 작은 아들이다. 그러면 A [4], A [5], A [6], A [7]에 네 명의 손자가 있습니다. 이 순서로 저장하는 방법을 알려주시겠습니까? – JiangFeng

관련 문제