지금부터는 책에서 데이터 구조를 배우고 있습니다. 완전한 이진 트리의 경우 배열에 저장할 수 있습니다. 하지만 알고리즘을 만들 수 없으며 배열을 완전한 이진 트리로 변환 할 수도 없습니다. 누구든지 C에서 이걸 도와 줄 수 있니? 이 질문은 재귀에서 해결할 수 있다고 생각합니다. 이진 트리를 순회하는 것과 같지만, 그것을 수행 할 수는 없으며 비 재귀 방법으로도 해결할 수 있습니다.완전한 이진 트리를 배열에 저장하는 알고리즘
답변
함수 포인터를 호출하는 순서 순회 (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);
함수 insert에는 더 많은 매개 변수가 필요합니다. 배열의 삽입 위치에 대한 포인터 일 수 있으므로 * ptr = data를 수행 할 수 있습니다. –
@PeterSkarpetis, 네 말이 맞아!, 편집 –
@AlterMann 대단히 고마워.하지만 분명히 표현하지 않은 것 같아. 나는 배열에 완전한 바이너리를 저장해야한다고 생각하는 순서대로 함수를 사용해서는 안된다. A [1]의 저장소 루트이고, A [2]의 큰 아들, A [3]의 작은 아들이다. 그러면 A [4], A [5], A [6], A [7]에 네 명의 손자가 있습니다. 이 순서로 저장하는 방법을 알려주시겠습니까? – JiangFeng
- 1. Inorder 이진 트리를 배열에 정렬
- 2. 이진 검색 트리를 기반으로 배열에 요소 추가
- 3. 파이썬에서 높이 'h'의 완전한 이진 트리를 빌드하는 데 문제가 있습니다.
- 4. 두 개의 이진 트리를 병합하십시오.
- 5. C++ 배열에 이진 입력을 저장하는 방법
- 6. 파이썬과 루비에서 이진 트리를 '그리는'라이브러리
- 7. Javascript : 이진 검색 트리를 이중 연결 목록으로 변환하는 알고리즘
- 8. 두 개의 이진 트리를 결합하는 알고리즘? 예를 들어
- 9. 이진 검색 트리에서 빨간색 검정 트리를 만들기위한 알고리즘
- 10. 알고리즘 - 두 개의 이진 탐색 트리를 효율적으로 연결하는 방법?
- 11. 완전한 이진 트리와 균형 이진 트리의 차이점
- 12. 이진 트리를 반복적으로 순회하기
- 13. 이진 트리를 반전하는 방법
- 14. 이진 트리를 해결
- 15. 파일에 이진 트리를 저장하려면
- 16. 이진 트리를 만드는 방법
- 17. Lisp에서 이진 트리를 검색
- 18. VS에서 이진 트리를 시각화하십시오.
- 19. 이진 트리를 트래버스하는 함수
- 20. 이진 트리를 충전하는 중
- 21. 이진 트리를 풀다 내기
- 22. 이진 트리를 무작위로 걸으시겠습니까?
- 23. 이진 트리의 하위 트리를 찾습니다.
- 24. 트리를 채우는 알고리즘
- 25. 스트림에서 이진 트리를 직렬화하고 트리를 다시 구성하십시오.
- 26. 이진 검색 트리를 순차적으로 인쇄하기
- 27. 침입 형/이진 검색 트리를 부스트
- 28. 이진 트리 알고리즘
- 29. 재귀 메서드가 자체적으로 이진 트리를 사용하여 호출하는 횟수를 저장하는 방법
- 30. 로컬 탐색 알고리즘, 완전한 혼동
에 오신 것을 환영합니다 : @ 피터 Skarpetis에 의해 지적, 당신은 전역 또는
static
의 함수에 포인터 후 추가 매개 변수를 전달을 사용하지 않도록 할 수 있습니다! 지금까지 연구/디버깅 노력을 보여주십시오. 먼저 [Ask] 페이지를 읽으십시오. –https://en.wikipedia.org/wiki/Binary_heap#Heap_implementation –
@PeteKirkham을 참조하십시오. 나에게 좋은 방향을 보여주었습니다. 지금 검색하는 방법을 알고 있습니다. :) – JiangFeng