題目描述
請實現兩個函式,分別用來序列化和反序列化二叉樹。
示例:
你可以將以下二叉樹:
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...