面試題37:序列化二叉樹
題目:請實現兩個函式,分別用來序列化和反序列化二叉樹。
如:將樹序列化為字串 “[1,2,3,null,null,4,5]”
還要將字串反序列化為二叉樹
序列化方法
用佇列進行層次遍歷,把結點一個個加入到結果集中
- 時間複雜度 O(n)
- 空間複雜度 O(n),需要開闢一個長度為 n 的佇列
反序列化方法
根據二叉樹結點之間的運算關係進行求解,若結點 cur 的下標為 x ,那麼其左子結點下標為 2 * x + 1,右子節點的下標為 2 * x + 2。雖然知道了結點下標的關係,但是還是需要遍歷樹,需要用佇列來模擬。
- 時間複雜度O(n)
- 空間複雜度On,)
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if (root == null) {
return "[]";
}
StringBuilder res = new StringBuilder("[");
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
if (node != null) {
res.append(node.val + ",");
queue.offer(node.left);
queue.offer(node.right);
} else {
res.append("null,");
}
}
res.deleteCharAt(res.length() - 1);
res.append("]");
return res.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if (data.equals("[]")) {
return null;
}
String[] vals = data.substring(1, data.length() - 1).split(",");
TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int i = 1;
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
// 為空的話就跳過,不用再考慮,所以有子結點的話,就一定會有值
if (!vals[i].equals("null")) {
node.left = new TreeNode(Integer.parseInt(vals[i]));
queue.offer(node.left);
}
i++;
if (!vals[i].equals("null")) {
node.right = new TreeNode(Integer.parseInt(vals[i]));
queue.offer(node.right);
}
i++;
}
return root;
}
}
相關文章
- 面試題7:重建二叉樹面試題二叉樹
- 序列化二叉樹二叉樹
- 刷題系列 - 序列化和反序列化一個二叉樹二叉樹
- 輕鬆搞定面試中的二叉樹題目面試二叉樹
- JZ-061-序列化二叉樹二叉樹
- 《劍指offer》:[62]序列化二叉樹二叉樹
- 資料結構和演算法面試題系列—二叉樹面試題彙總資料結構演算法面試題二叉樹
- Leetcode 二叉樹題目集合 (看完這個面試不會做二叉樹題,辣條給你!!!!!)LeetCode二叉樹面試
- 相同二叉樹和鏡面二叉樹問題二叉樹
- 面試官:什麼是二叉樹面試二叉樹
- 幾道和「二叉樹」有關的演算法面試題二叉樹演算法面試題
- [演算法總結] 20 道題搞定 BAT 面試——二叉樹演算法BAT面試二叉樹
- 面試題36:二叉搜尋樹與雙向連結串列面試題
- 面試題34:二叉樹中和為某一值的路徑面試題二叉樹
- 二叉排序樹(水題)排序
- 一文帶你看懂二叉樹的序列化二叉樹
- 滿二叉樹、完全二叉樹、平衡二叉樹、二叉搜尋樹(二叉查詢樹)和最優二叉樹二叉樹
- 一道關於二叉樹的位元組面試題的思考二叉樹面試題
- 二叉樹相關題目二叉樹
- 二叉樹高頻題(下)二叉樹
- LeetCode 297. Serialize and Deserialize Binary Tree 二叉樹序列化反序列化LeetCode二叉樹
- 資料結構和演算法面試題系列—二叉樹基礎資料結構演算法面試題二叉樹
- 【谷歌面試題】找出二叉查詢樹中出現頻率最高的元素谷歌面試題
- 【谷歌面試題】有序輸出兩棵二叉查詢樹中的元素谷歌面試題
- 微軟面試題,將二叉排序樹轉換成雙向連結串列微軟面試題排序
- 【面試】基於二叉樹層次遍歷相關問題的求解面試二叉樹
- 二叉樹 & 二叉查詢樹二叉樹
- LeetCode637.二叉樹的層平均值LeetCode二叉樹
- 洛谷題單指南-二叉堆與樹狀陣列-P3378 【模板】堆陣列
- 部分二叉樹題目彙總二叉樹
- C++二叉樹筆試題C++二叉樹筆試
- 一篇文章搞定面試中的二叉樹題目(java實現)面試二叉樹Java
- 面試8:找二叉樹的下個結點面試二叉樹
- PHP面試:說說你理解的二叉樹吧PHP面試二叉樹
- 排序二叉樹和平衡二叉樹排序二叉樹
- 二叉查詢樹(二叉排序樹)排序
- 二叉樹(順序儲存二叉樹,線索化二叉樹)二叉樹
- [每日一題] 第八題:二叉樹的深度每日一題二叉樹