2013-11-15 103 views
4

我有一個非平衡的(不是二進制搜索)二叉樹 需要incode(和後來解碼)到txt文件。 如何以有效的方式做到這一點?保存一個二進制樹到一個文件

我發現這個link 其中談到了類似的(相同)的問題,但對我來說

+1

我會使用XML格式。它是存儲樹結構的一種自然方式。 – andre

+1

爲什麼不能使用您鏈接的問題中給出的解決方案之一?另外,它是否必須是文本文件? (「高效」和「文本文件」並不真正在一起) – harold

回答

9

請看this on LeetCode很明顯。

我喜歡這個解決方案,因爲它相對高效並且生成光輸出文件。

假設你有樹這樣的:

_30_ 
/ \  
    10 20 
/ /\ 
50 45 35 

該解決方案可以讓你把它序列化到這樣的輸出文本文件:

30 10 50 # # # 20 45 # # 35 # # 

要做到這一點,足以進行簡單預先遍歷樹:

void writeBinaryTree(BinaryTree *p, ostream &out) { 
    if (!p) { 
    out << "# "; 
    } else { 
    out << p->data << " "; 
    writeBinaryTree(p->left, out); 
    writeBinaryTree(p->right, out); 
    } 
} 

正如你所看到的,一個# sym bol用來表示空節點。

反序列化這個字符串變成一棵樹,你可以使用:

void readBinaryTree(BinaryTree *&p, ifstream &fin) { 
    int token; 
    bool isNumber; 
    if (!readNextToken(token, fin, isNumber)) 
    return; 
    if (isNumber) { 
    p = new BinaryTree(token); 
    readBinaryTree(p->left, fin); 
    readBinaryTree(p->right, fin); 
    } 
} 

正如我前面所說,這種方法產生的二叉樹的輕量級表示。

當然,它有一個嚴重的缺點:它需要一個符號來表示空節點。

如果樹的節點是可以包含此符號本身的字符串,則可能會導致潛在問題。

相關問題