使用C++迭代法從二維矩陣構造連結串列


假設我們有一個矩陣,我們需要使用迭代法將其轉換為二維連結串列。該連結串列將具有右指標和下指標。

因此,如果輸入如下:

102030
405060
708090

那麼輸出將是

為了解決這個問題,我們將遵循以下步驟:

  • 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

更新於:2020年8月27日

161 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告