劍指Offer 37 序列化與反序列化二叉樹

2022-08-11 07:33:15 字數 1815 閱讀 5957

題目描述

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

示例: 

你可以將以下二叉樹:

1/ \

2 3

/ \4 5

序列化為 "[1,2,3,null,null,4,5]"

序列化的形式不定,最終需要達到的效果是deserialize(serialize(root));可以還原原來的樹。

思路序列化的順序顯然為層序遍歷,因此只需要在層序遍歷過程中不斷生成序列化字串即可:

特殊情況:二叉樹為空,返回「」

初始化結果字串res=""

層序遍歷,同時節點為空則 res+= "#," , 否則res+=`,`

用substring方法去掉最後乙個「,」

返回 `[$]`

反序列化也類似層序遍歷,用同樣的邏輯實現一層一層從左至右地建樹:

特殊情況,輸入字串為 "", 二叉樹為空。

將字串按「,」分割成陣列nodes(字串陣列)

取出陣列第乙個元素,新建為root節點

新建佇列陣列queue,並將root入隊

當queue非空:取出queue隊首,為當前需要處理的節點cur

取出nodes首元素,為cur的左兒子的值。若不是「#」,新建左兒子節點加入樹,併入佇列queue。

取出nodes首元素,為cur的右兒子的值。若不是「#」,新建右兒子節點加入樹,併入佇列queue。

返回root

(已經加入樹中但兒子節點還沒處理完的放在queue裡,還沒有被處理的放在nodes中,已經建好的節點出隊)

**:

/*

* * definition for a binary tree node.

* function treenode(val) */

/*** encodes a tree to a single string.

* * @param root

* @return */

var serialize = function

(root) ,`;

queue.push(head.left);

queue.push(head.right);

}else

}//刪去最後乙個,

res = res.substring(0, res.length-1);

return

`[$]`;

};/*

* * decodes your encoded data to tree.

* * @param data

* @return */

var deserialize = function

(data)

const nodes = data.substring(1, data.length-1).split(',');

const root = new

treenode(parseint(nodes.shift()));

const queue =[root];

while

(queue.length)

const rightval =nodes.shift();

if(rightval !== "#")

}return

root;

};/*

* * your functions will be called as such:

* deserialize(serialize(root));

*/

時間複雜度: o(n)

空間複雜度:o(n)

易錯:最後乙個","需要單獨去掉。

劍指Offer 37 序列化二叉樹

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

劍指offer37 序列化二叉樹

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

《劍指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...