Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

สร้าง Linked List แบบ 2 มิติจาก Matrix ด้วย Recursive Approach ใน C++


สมมติว่าเรามีเมทริกซ์ (matrix) เราต้องการแปลงมันเป็น linked list แบบ 2 มิติโดยใช้วิธี recursive โหนดแต่ละตัวจะมี pointer สองตัวคือ right (ชี้ไปทางขวา) และ down (ชี้ไปทางล่าง)

ตัวอย่างอินพุต:

102030
405060
708090

เอาต์พุทจะเป็นโครงสร้าง linked list 2 มิติตามภาพ:

สร้าง Linked List แบบ 2 มิติจาก Matrix ด้วย Recursive Approach ใน C++

ขั้นตอนการแก้ปัญหา (Recursive)

  1. สร้างฟังก์ชัน make_2d_list(mat, i, j, m, n) ที่รับเมทริกซ์ ตำแหน่งปัจจุบัน และขนาด
  2. ถ้า i หรือ j เกินขอบเขตเมทริกซ์ → คืนค่า NULL
  3. สร้างโหนดใหม่เก็บค่า mat[i][j]
  4. กำหนด right โดยเรียก recursive ไปที่ (i, j+1)
  5. กำหนด down โดยเรียก recursive ไปที่ (i+1, j)
  6. คืนค่าโหนดที่สร้าง

ตัวอย่างโค้ด C++

#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 i, int j, int m, int n) {
    if (i > n - 1 || j > m - 1) return NULL;
    TreeNode* temp = new TreeNode(mat[i][j]);
    temp->right = make_2d_list(mat, i, j + 1, m, n);
    temp->down = make_2d_list(mat, i + 1, j, m, n);
    return temp;
}

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, 0, 0, m, n);
    show_2d_list(head);
}

อินพุต

{ { 10, 20, 30 }, { 40, 50, 60 }, { 70, 80, 90 } }

เอาต์พุท

10 20 30
40 50 60
70 80 90