什麼是參與在一個文件中表示二進制樹不同的策略,使樹形結構可以很容易地重現?我使用C.在文件中表示二進制樹
回答
存儲在文件中的樹的序和序遍歷。任何二叉樹都可以按照順序和前序遍歷來重構[1]。
[1] http://www.geeksforgeeks.org/construct-tree-from-given-inorder-and-preorder-traversal/
做一箇中序遍歷,並將節點的值寫入用新行定界的文件。如果節點是葉子,則在葉子值之後存儲特殊字符(例如#)。
當您讀取文件時,直到您沒有'#'插入值,然後下降到左邊。如果你得到'#',直到右邊沒有元素,然後下降到右邊。這是遞歸的。
對不起,它不會保留你的原始樹。它將只保留具有相同數字的正確二進制搜索樹。 – WebMonster 2012-01-10 11:10:19
下降到左邊你的意思是,將一個孩子附在左邊,對嗎?那麼你提升的意思是什麼? – PaulDaviesC 2012-01-10 11:19:53
如果一個節點沒有合適的孩子,這是行不通的。你需要爲這種情況加額外的#。 – 2012-01-10 15:22:36
這裏有一個簡單的方式,假設你有這樣的:
struct bst {
int val;
struct bst *left; // NULL when no node
struct bst *right;
}
讓另一個結構如下所示:
struct bst_serial {
int val;
int left; // NULL when no node
int right;
}
然後的malloc bst_serial
秒的數組,它是爲你的樹一樣大:
struct bst_serial *serial_bst = malloc(sizeof(struct bst_serial) * tree_size);
現在,做樹的遍歷像這樣(未經):
int current_pos = 0;
int convert_node(bst *root) {
int this_pos = current_pos;
current_pos++;
serial_bst[this_pos].val = root->val;
if(root->left != NULL) {
serial_bst[this_pos].left = convert_node(root->left);
} else {
serial_bst[this_pos].left = -1;
}
if(root->right != NULL) {
serial_bst[this_pos].right = convert_node(root->right);
} else {
serial_bst[this_pos].right = -1;
}
return this_pos;
}
您現在可以將write()
數組輸出到磁盤。如果你編寫函數遍歷bst_serial
類型的樹,那麼你甚至不需要反序列化它 - 你可以只用mmap()
它。對於額外的點,首先不要使用指針樹 - 在創建二叉樹時創建並增長bst_serial
數組。然後,您的代碼不需要關心它是從磁盤還是剛剛創建的樹處理樹。
爲了能夠構建精確的樹,您將需要至少2遍樹的遍歷。因爲在給定的遍歷中可能有多個唯一的樹。
例如,您可以將二叉樹的inorder和preorder遍歷存儲到您的文本文件中,並在重新創建樹時從下面的鏈接開始執行。
http://leetcode.com/2011/04/construct-binary-tree-from-inorder-and-preorder-postorder-traversal.html
- 1. 二進制表示樹
- 2. 二進制樹的數字文件Java
- 3. 如何在tmux-sidebar目錄樹中隱藏二進制文件?
- 4. 二進制搜索樹內的二進制搜索樹
- 5. 在OCaml中打印二進制樹
- 6. 在非二進制樹中搜索
- 7. 構建二進制表達式樹
- 8. MIPS懂二進制表示
- 9. 如何在另一個二進制文件中定義二進制文件?
- 10. 二進制搜索樹C++
- 11. 二進制搜索樹Instantiaition
- 12. 二進制搜索樹toString
- 13. 二進制搜索樹
- 14. 二進制樹的創建
- 15. Haskell - 二進制搜索樹
- 16. 二進制搜索樹C++
- 17. 二進制搜索樹C++
- 18. 如何獲得graphviz的DOT來表示二進制樹正確
- 19. 如何用數組表示二進制和n元滿樹?
- 20. 複製二進制文件
- 21. 比較二進制文件的文本表示
- 22. 從文本文件創建二進制(家族)樹
- 23. 在Java中寫入二進制文件
- 24. 在MatLab中讀取二進制文件
- 25. 在Ruby中寫入二進制文件
- 26. 在PHP中解壓二進制文件
- 27. 在$ PATH中查找二進制文件
- 28. 在git中登記二進制文件
- 29. 在SVN中壓縮二進制文件?
- 30. 書面二進制文件在C++中
我覺得你的問題太含糊。在Java中,我猜你可以使用'Serializable'。 – insumity 2012-01-10 10:41:36
問題很模糊,你能更精確嗎! – Pratik 2012-01-10 10:42:04
我將使用c程序創建一個二叉樹,並且我需要將樹結構存儲到一個文件中,以便通過從文件中讀取,我可以再次重新創建樹。 – PaulDaviesC 2012-01-10 10:45:58