劍指offer37 序列化二叉樹

2021-10-01 13:04:09 字數 2633 閱讀 5848

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

二叉樹的序列化是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序、中序、後序、層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點(#),以 ! 表示乙個結點值的結束(value!)。

二叉樹的反序列化是指:根據某種遍歷順序得到的序列化字串結果str,重構二叉樹。

先來個搞笑的解法

深深地膜拜,誰讓人家一眼就把題看透了呢!!

/*

struct treenode

};*/

class

solution

treenode*

deserialize

(char

*str)

};

真槍實練

用了非遞迴的演算法,採用層次遍歷的形式

**中沒有完全按照題目的要求:

上述思想參考:牛課討論

/*

struct treenode

};*/

class

solution

q.push

(p);

int k=0;

while

(!q.

empty()

)if(p->left)

q.push

(p->left)

;else

q.push

(null);

if(p-

>right)

q.push

(p->right)

;else

q.push

(null);

q.pop();

}}res[k++]=

'!';

return

(char

*)res;

} treenode*

deserialize

(char

*str)

else

//判斷是否構建完畢

if(str1[k]

==0x233

)break

;//建立當前節點的右孩子

if(str1[k]

!=0x244

)else

q.pop();

}}return root;}}

;

二刷

第一遍做的時候思路清晰,但是一些小細節的東西都是參考別人的**通過的,在二刷的時候遇到了很多困難,剛開始用先序遍歷非遞迴思想來處理,程式執行的過程中老是出現段錯誤,於是轉戰遞迴形式

下面簡單說下幾個出問題的點:

如何將節點儲存成字元陣列:

首先用to_string方法,將整型轉化成string型別,再利用.to_str轉化成char*型別。儲存完乙個節點後面加個「,」便於區分不同的節點

反序列化時,程式中給左右子樹傳遞的引數都是str對嗎?

對的,在遞迴的過程中str是一直往後移動的,並且傳入的引數是引用型別,使得在程式執行中的改變能夠儲存到最後。

/*

struct treenode

};*/

class

solution

//先將根節點序列化

string s =

to_string

(root-

>val)

; s +

=','

;char

*s_left =

serialize

(root-

>left)

;char

*s_right =

serialize

(root-

>right)

;char

*c_s =

newchar

[s.length()

+strlen

(s_left)

+strlen

(s_right)];

strcpy

(c_s, s.

c_str()

);strcat

(c_s, s_left)

;strcat

(c_s, s_right)

;return c_s;

} treenode*

deserialize

(char

*str)

private

: treenode*

decode

(char

*&str)

int num =0;

while

(*str !=

',')

++str;

treenode *root =

newtreenode

(num)

; root-

>left =

decode

(str)

; root-

>right =

decode

(str)

;return root;}}

;

劍指Offer 37 序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹 例 樹 1 2 3 4 5 6 序列化 1,2,4,3,5,6,容易發現序列化其實就是帶none的前序遍歷。所以題目就是完成乙個前序遍歷將節點值存入列表,遍歷列表按前序生成一棵二叉樹。時間複雜度 o n 空間複雜度 o n from datstru i...

《劍指offer》 37 序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹。示例 你可以將以下二叉樹 1 2 3 4 5 序列化為 1,2,3,null,null,4,5 層序遍歷,使用乙個佇列輔助queue 的 push pop front to string複雜度 o時間複雜度 o n 空間複雜度 o n definiti...

劍指 Offer 37 序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹。示例 你可以將以下二叉樹 1 2 3 4 5序列化為 1,2,3,null,null,4,5 這個題目出的很籠統,沒有任何規定,很是奇怪,在這裡利用了輸入輸出流解題。definition for a binary tree node.struct tr...