劍指Offer 序列化二叉樹

2021-08-19 19:50:04 字數 1119 閱讀 7578

請實現兩個函式,分別用來序列化和反序列化二叉樹

根據前面的面試題重建二叉樹,我們知道可以從前序遍歷和中序遍歷構造出一棵二叉樹。受此啟發,我們可以先把一棵二叉樹序列化成乙個前序遍歷序列和乙個中序序列的結合,然後再反序列化時通過這兩個序列重構出原二叉樹。

但是這個思路有兩個缺點。乙個缺點是該方法要求二叉樹中不能用有數值重複的結點。另外只有當兩個序列中所有資料都讀出後才能開始反序列化。如果兩個遍歷序列的資料是從乙個流裡讀出來的,那就可能需要等較長的時間。

實際上如果二叉樹的序列化是從根結點開始的話,那麼相應的反序列化在根結點的數值讀出來的時候就可以開始了。因此我們可以根據前序遍歷的順序來序列化二叉樹,因為前序遍歷是從根結點開始的。當在遍歷二叉樹碰到 null 指標時,這些 null 指標序列化成乙個特殊的字元(比如『$』)。另外,結點的數值之間要用乙個特殊字元(比如』,』)隔開。以下圖中的二叉樹為例:

1                 1

2 /\

3 2 3

4 / / \

5 4 5 6

二叉樹的遍歷做多了後,遞迴實現前序遍歷和根據前序遍歷得到的序列重建二叉樹應該不難,這道題對我而言主要問題在於對輸入流的控制,一直用的不太好,就不拿自己的**出來誤導人了,找了個別人的**來看看。

/*

struct treenode

};*/

class solution

int num = 0;

while(*str != ',')

num = num*10 + (*(str++)-'0');

str++;

treenode *root = new treenode(num);

root->left = decode(str);

root->right = decode(str);

return root;

}public:

char* serialize(treenode *root)

treenode* deserialize(char *str)

};

劍指offer 序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹。首先得理解題目的意思,序列化就是返回乙個帶有 和逗號的字串。反序列化就是根據帶有 和逗號的字串返回一棵二叉樹。比如對於二叉樹 1 2 3 4 5 6 7來講,序列化的結果是1,2,3,4,7,5,而反序列化的結果則是輸出一棵二叉樹。public cla...

劍指offer 序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹 首先這道題目是要有兩個問題,第乙個是把一棵二叉樹按照前序遍歷的方式變成乙個字串。第二個是把乙個字串變成乙個二叉樹。對於第乙個問題來說,我們要對這棵樹進行乙個前序遍歷,按照中左右的方式放入列表中,如果節點為空,則插入 最後.join 來實現列表到字串的轉...

劍指offer 序列化二叉樹

題目描述 請實現兩個函式,分別用來序列化和反序列化二叉樹 思路 二叉樹被建立成檔案的過程叫做序列化,而從檔案來重新構造二叉樹的過程叫做反序列化。序列化可以這樣來做,利用先序遍歷二叉樹,當遍歷的節點不為空時,將節點的值變為字串並在後面加上!來表示分割,當對應位置的節點為空時,在字串後面加上 反序列化就...