劍指Offer JZ61 序列化二叉樹 C 實現

2021-10-24 18:24:02 字數 1447 閱讀 4677

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

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

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

例如,我們可以把乙個只有根節點為1的二叉樹序列化為"1,",然後通過自己的函式來解析回這個二叉樹

1、思路:層次遍歷二叉樹,在序列化過程中,如果當前結點不是空結點,則不管當前結點的左右結點是否為空,都加入佇列。遇到空結點則對字串拼接"#!",否則拼接結點值和'!'。

反序列化時,再模擬一次層次遍歷,首先將根結點構造出來入隊,然後在字串中過濾根節點,檢視字串當前結點值:如果為'#',則左結點為空,過濾"#!",否則構造左結點,然**隊並在字串中過濾左結點;再次檢視字串當前結點值:如果為'#',則右結點為空,過濾"#!",否則構造右結點,然**隊並在字串中過濾右結點。重複上述過程直到隊列為空或字串為空。

2、**:

/*

struct treenode

};*/

class solution else

}char *result = new char[tmp.length() + 1]; // '\0'

strcpy(result, tmp.c_str());

// copy(tmp.begin(), tmp.end(), result);

return result;

}treenode* deserialize(char *str) else

if (s[0] == '#') else

}return root;

}};

3、複雜度:

時間複雜度:o(n);

空間複雜度:o(n)。

1、思路:前序遍歷遞迴二叉樹。序列化的過程套用前序遍歷模板,反序列化的過程類似。

2、**:

class solution 

treenode* deser(char *&str)

int num = atoi(str);

while (*str != '!')

str++;

treenode *root = new treenode(num);

root->left = deser(str);

root->right = deser(str);

return root;

}treenode* deserialize(char *str)

};

3、複雜度:

時間複雜度:o(n);

空間複雜度:o(n)。

劍指offer JS題解 61 序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹 二叉樹的序列化是指 把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序 中序 後序 層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點 以 表示...

劍指offer(61)序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹 首先拿到題目時候,我先想到的是什麼是序列化二叉樹?序列化主要就是在前後端互動時候需要轉換下,畢竟網路傳輸的是流式資料 二進位制或者文字 而不是物件。所以序列化二叉樹就是轉化成字串。之前解決重建二叉樹問題時候,我們可以知道,兩個遍歷序列就可以確定一顆二叉...

劍指Offer 61 序列化二叉樹

請實現兩個函式,分別用來序列化和反序列化二叉樹 使用前序遍歷,將遇到的結點新增到字串中,遇到null則將乙個 新增要序列化字串中。反序列化時,每次讀取根結點,然後讀取其左結點,遇到 null 時,返回上層。樹結點定義 public class treenode 實現 public class sol...