행렬이 하나 있다고 가정하면 반복 접근 방식을 사용하여 이를 2차원 연결 목록으로 변환해야 합니다. 목록에는 오른쪽 및 아래쪽 포인터가 있습니다.
따라서 입력이 다음과 같으면
| 10 | 20 | 30 |
| 40 | 50 | 60 |
| 70 | 80 | 90 |
그러면 출력은

이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
real_head :=NULL
-
크기가 m인 배열 head_arr을 정의합니다.
-
initialize i :=0의 경우 i
-
head_arr[i] :=NULL
-
j 초기화의 경우:=0, j
-
p :=값이 mat[i, j]
인 새 트리 노드 -
real_head가 null이면 -
-
real_head :=피
-
-
head_arr[i]가 null이면 -
-
head_arr[i] :=p
-
-
그렇지 않으면
-
right_ptr의 오른쪽 :=p
-
-
right_ptr :=p
-
-
-
initialize i :=0의 경우 i
-
p :=head_arr[i], q =head_arr[i + 1]
-
동안(p와 q 둘 다 null이 아님) −
-
아래로 p :=q
-
p :=p의 오른쪽
-
q :=q의 오른쪽
-
-
-
real_head 반환
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
#include <bits/stdc++.h>
using namespace std;
class TreeNode {
public:
int data;
TreeNode *right, *down;
TreeNode(int d){
data = d;
right = down = NULL;
}
};
void show_2d_list(TreeNode* head) {
TreeNode *right_ptr, *down_ptr = head;
while (down_ptr) {
right_ptr = down_ptr;
while (right_ptr) {
cout << right_ptr->data << " ";
right_ptr = right_ptr->right;
}
cout << endl;
down_ptr = down_ptr->down;
}
}
TreeNode* make_2d_list(int mat[][3], int m, int n) {
TreeNode* real_head = NULL;
TreeNode* head_arr[m];
TreeNode *right_ptr, *p;
for (int i = 0; i < m; i++) {
head_arr[i] = NULL;
for (int j = 0; j < n; j++) {
p = new TreeNode(mat[i][j]);
if (!real_head)
real_head = p;
if (!head_arr[i])
head_arr[i] = p;
else
right_ptr->right = p;
right_ptr = p;
}
}
for (int i = 0; i < m - 1; i++) {
TreeNode *p = head_arr[i], *q = head_arr[i + 1];
while (p && q) {
p->down = q;
p = p->right;
q = q->right;
}
}
return real_head;
}
int main() {
int m = 3, n = 3;
int mat[][3] = {
{ 10, 20, 30 },
{ 40, 50, 60 },
{ 70, 80, 90 } };
TreeNode* head = make_2d_list(mat, m, n);
show_2d_list(head);
} 입력
{ { 10, 20, 30 },
{ 40, 50, 60 },
{ 70, 80, 90 } } 출력
10 20 30 40 50 60 70 80 90