使用C++迭代法從二維矩陣構造連結串列
假設我們有一個矩陣,我們需要使用迭代法將其轉換為二維連結串列。該連結串列將具有右指標和下指標。
因此,如果輸入如下:
10 | 20 | 30 |
40 | 50 | 60 |
70 | 80 | 90 |
那麼輸出將是
為了解決這個問題,我們將遵循以下步驟:
real_head := NULL
定義一個大小為m的陣列head_arr。
對於初始化 i := 0,當 i < m,更新(i增加1),執行:
head_arr[i] := NULL
對於初始化 j := 0,當 j < n,更新(j增加1),執行:
p := 一個值為mat[i, j]的新樹節點
如果real_head為null,則:
real_head := p
如果head_arr[i]為null,則:
head_arr[i] := p
否則
right_ptr的right := p
right_ptr := p
對於初始化 i := 0,當 i < m - 1,更新(i增加1),執行:
p := head_arr[i],q = head_arr[i + 1]
當(p和q都不為null)時,執行:
p的down := q
p := p的right
q := q的right
返回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
廣告