이진 검색 트리의 수준 순서 순회를 수행하고 최종 결과를 다차원 배열로 반환하려고합니다. 예. 루트 노드 가 2
있고 레벨 1의 노드 가 있으면 코드에서와 같이 1,4
반환해야 합니다. 나는 데이터 구조가 처음이며 기능을 사용 하는 데에도 명령이 없습니다 . 어떤 도움을 주시면 감사하겠습니다. 감사 :)[[2], [1,4]]
returnColumnSizes
malloc
int height(struct TreeNode *h){
if (h == NULL) return 0;
int l = height(h->left);
int r = height(h->right);
if (l > r)
return l+1;
else
return r+1;
}
int *ordercalc(struct TreeNode *root, int level){
if (root == NULL) return NULL;
int i = 0, arr[100];
if (level == 1)
arr[i++] = root->val;
else if(level > 1){
ordercalc(root->left, level-1); //decrease the level one per call to print data when it
ordercalc(root->right, level-1); // reaches proper level
}
return arr;
}
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
if (*returnSize == 0) return NULL;
**returnColumnSizes = (int **)malloc(*returnSize * sizeof(int *));
for (int i=0;i<height(root)+1;i++){
returnColumnSizes[i] = (int *)malloc(sizeof(int) * 10);
returnColumnSizes[i] = ordercalc(root, i);
}
return returnColumnSizes;
}
height
좋아 보인다.
levelOrder
변경되지 않더라도 루프 i<height(root)+1;
의 높이를 root
반복해서 계산 하지만 괜찮아 보입니다 . 또한 malloc(sizeof(int) * 10);
큰 나무에 대해서는 충분히 동적으로 보이지 않습니다 (나중에 다시 설명하겠습니다).
ordercalc
재고해야합니다. 함수가 arr[100];
스택 프레임에 할당 된 다음
if (level == 1)
arr[i++] = root->val;
과
return arr;
높이를 기준으로 레벨을 채우려 고하는 것을 알 수 있습니다. 올바른 아이디어입니다. 하나:
malloc
수행하려면 힙에서 포인터를 반환해야합니다.arr[i++] = root->val;
루트를 배치 arr[0]
하지만이 배열에서는 다른 일이 발생하지 않으므로 의도가 명확하지 않습니다.100
배열 크기에 대한 하드 코딩 은 실수로 보입니다. 확실히이 버퍼를 오버플로 할만큼 충분히 큰 레벨을 가진 트리가 있는데, 루트 너머로 채우려 고한다고 가정합니다. 로 전환 할 때 malloc
으로 계획해야 할 것입니다 realloc
.이 함수에서 결과를 반환하는 대신 미리 할당 된 결과 구조에 대한 포인터를 전달하는 것이 가장 간단 해 보입니다.
재 할당 및 크기 관리를 단순화하는 방법은 여러 단계로 문제에 접근하는 것입니다. 다음은 게임 계획입니다.
코드는 다음과 같습니다.
int height(struct TreeNode *root) {
if (root) {
int left = height(root->left);
int right = height(root->right);
return 1 + (left > right ? left : right);
}
return 0;
}
void set_col_lens(struct TreeNode *root, int *res_col_lens, int depth) {
if (root) {
res_col_lens[depth]++;
set_col_lens(root->left, res_col_lens, depth + 1);
set_col_lens(root->right, res_col_lens, depth + 1);
}
}
void fill_levels(struct TreeNode *root, int **res, int *last_items, int level) {
if (root) {
int last_item = last_items[level]++;
res[level][last_item] = root->val;
fill_levels(root->left, res, last_items, level + 1);
fill_levels(root->right, res, last_items, level + 1);
}
}
int **level_order(struct TreeNode *root, int *res_len, int **res_col_lens) {
if (!root) {
*res_len = 0;
return NULL;
}
*res_len = height(root);
int **res = malloc(sizeof(*res) * (*res_len));
*res_col_lens = calloc(*res_len, sizeof(**res_col_lens));
int *last_items = calloc(*res_len, sizeof(*last_items));
set_col_lens(root, *res_col_lens, 0);
for (int i = 0; i < *res_len; i++) {
res[i] = malloc(sizeof((*res)[i]) * (*res_col_lens)[i]);
}
fill_levels(root, res, last_items, 0);
free(last_items);
return res;
}
이것의 한 가지 이점은 문제가 간단하고 뚜렷한 단계로 나뉘어져 있다는 것입니다.
더 자연스러운 또 다른 접근 방식은 대기열을 사용하고 하나의 스택 프레임에서 폭 우선 순회를 수행하는 것입니다. 그런 다음 문제는 C로 큐 추상화를 작성하게되는데, 이는 어렵지 않지만 약간의 소란이 필요합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다