簡體   English   中英

試圖從存儲在二進制文件中的預序遍歷中構建一棵樹?

[英]Trying to build a tree out of a pre order traversal which is stored in a binary file?

我有一個二進制文件的例子:

0000000: 11111011 11111111 11111111 11111111 00000001 11111100  ......
0000006: 11111111 11111111 11111111 00000001 11111101 11111111  ......
000000c: 11111111 11111111 00000001 11111110 11111111 11111111  ......
0000012: 11111111 00000001 11111111 11111111 11111111 11111111  ......
0000018: 00000001 00000000 00000000 00000000 00000000 00000001  ......
000001e: 00000001 00000000 00000000 00000000 00000001 00000010  ......
0000024: 00000000 00000000 00000000 00000001 00000101 00000000  ......
000002a: 00000000 00000000 00000001 00000100 00000000 00000000  ......
0000030: 00000000 00000000                                      ..

這是同一文件的 txt 表示,其中每一行代表一個節點:

-5 1
-4 1
-3 1
-2 1
-1 1
 0 1
 1 1
 2 1
 5 1
 4 0

其中第一個數字是節點的值。 下一個數字代表節點有多少個孩子。 0 表示沒有孩子。 1 表示一個右子。 2 表示一個左孩子。 3 表示兩個孩子。

這是一個節點的結構:

struct Tnode {
int key;
char child;
struct Tnode * left;
struct Tnode * right;
} Tnode;

目前,對於每個節點,我嘗試使用 fread 兩次,一次獲取 int 鍵,然后獲取 char 子項。 但是,鑒於二叉樹包含先序遍歷,我該如何實際構建樹? 我們遇到的第一個節點必須是根節點。 因為它旁邊有一個 1,所以它只有一個右孩子(這將存儲在 char 孩子中)。 因此,下一個節點必須是它的右孩子,依此類推。 基本上,在這個例子中,右邊一直在右邊,直到它以 4 結束。但是我在構建它時遇到了麻煩。 有小費嗎?

您可以使用遞歸解決這個問題:

您創建了一個函數process_node ,它接受一個參數,即指向新節點的指針的地址。 第一次調用該函數時,這將是指向根節點的指針的地址。

函數process_node執行以下操作:

  1. 它為一個struct Tnode分配內存。
  2. 然后它從文件中讀取int keychar child ,並將該信息寫入新分配的struct Tnode
  3. 然后它將新創建的節點的地址寫入它作為函數參數接收的地址(在第一個函數調用中是指向根節點的指針的地址)。 這樣,新節點現在正確鏈接到樹。
  4. 如果新節點有一個右孩子,那么函數process_node現在將遞歸調用自己,但這次函數調用的函數參數將是它的right成員變量的地址。 這樣,新調用的函數將改為寫入該地址。 如果節點沒有右孩子,則right成員變量設置為NULL
  5. 對左孩子重復步驟 4。
  6. 函數返回。

在所有遞歸函數調用返回后,您應該有一個完全構建的二叉樹。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM