기본적인 컴퓨터 과학 개념을 읽기 전에
- 이진 트리는 동적으로 할당 된 구조입니다 (일반적으로 주문 스토리지에 사용됨).
- 이진 트리의 특성상 일반적으로 재귀 적입니다.
이는 두 개의 루핑 경로가있을 때 루프를 통한 선형 순회가 자연스럽지 않기 때문입니다.- 재귀 : 이것은 스스로 호출하는 함수를 의미합니다.
- 구식 언어에서 메모리 관리에는 수동 메모리 관리가 필요합니다.
- 수동 : 스스로해야한다는 의미입니다.
- 수동 메모리 관리를 수행 할 때는 기본 시스템에 트리의 각 멤버를 해제하도록 요청해야합니다.
- Free : 전역 똥에 메모리를 복구하여 재사용 할 수 있고 메모리가 부족하지 않습니다.
- 해제 : 함수를 호출하고
free()
복구하려는 포인터를 전달하면됩니다. - 포인터 : 가상 스틱과 같습니다. 마지막에는 메모리입니다. 메모리를 요청하면 메모리가있는 포인터 (가상 스틱)가 제공됩니다. 완료되면 포인터 (가상 스틱)를 돌려줍니다.
재귀 솔루션 :
freeTree(Node* node)
{
freeTree(node->left);
freeTree(node->right);
free(node);
}
문제는 재귀가 동일한 함수를 반복적으로 호출한다는 것을 의미합니다. 스택이 커집니다. 스택을 늘리면 더 많은 메모리가 사용됩니다. 트리를 비우는 이유는 더 많은 메모리를 사용하여 메모리를 다시 되 돌리는 것이 비생산적입니다 (두 비트의 메모리를 모두 다시 가져 오더라도).
마침내 질문 :
따라서 문제는 위의 재귀 버전을 선형 솔루션으로 변환하는 것입니다 (따라서 메모리를 사용할 필요가 없습니다).
노드 유형을 제공하십시오
typedef struct Node Node;
struct Node
{
Node* left;
Node* right;
};
이 노드의 트리를 해제하는 함수를 작성하십시오.
제한 사항 :
- 재귀를 사용할 수 없음 (간접적으로는 안됨)
추적을 위해 동적 공간을 할당 할 수 없습니다.
O (n) 솔루션이 있습니다.
우승자:
- 최고의 복잡성.
- 타이 브레이크 1 : 처음 제출
- 타이 브레이크 2 : 문자 수가 가장 적습니다.