同時這一題也是leetcode的297題,二叉樹的序列化和反序列化
題目描述
請實現兩個函式,分別用來序列化和反序列化二叉樹
二叉樹的序列化是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式儲存為字串,從而使得記憶體中建立起來的二叉樹可以持久儲存。序列化可以基於先序、中序、後序、層序的二叉樹遍歷方式來進行修改,序列化的結果是乙個字串,序列化時通過 某種符號表示空節點(#),以 ! 表示乙個結點值的結束(value!)。
二叉樹的反序列化是指:根據某種遍歷順序得到的序列化字串結果str,重構二叉樹。
思路
寫了兩種方法的,乙個是先序遍歷,乙個是層次遍歷
1.先序遍歷
/*
public class treenode }*/
public
class
solution
res = string.
valueof
(root.val)
+"!"
; res +=
serialize
(root.left)
; res +=
serialize
(root.right)
;return res;
}private
int index =0;
treenode deserialize
(string str)
treenode deserialize
(string[
] nums,treenode root)
else
}return null;
}}
2.層次遍歷
但是時間複雜度要比先序遍歷的低
/**
* definition for a binary tree node.
* public class treenode
* }*/public
class
codec
else
} res = res.
substring(0
,res.
length()
-1);
res +=
"]";
return res;
}// decodes your encoded data to tree.
public treenode deserialize
(string data)
/*queuequeue = new linkedlist<>();
for(int i = 0;i < strs.length;i ++)else
}*/queue
tmp =
newlinkedlist
<
>()
; treenode root =
newtreenode
(integer.
valueof
(strs[0]
)); treenode prootoftree = root;
int i =1;
//while(!queue.isempty())if(
!strs[i+1]
.equals
("null"))
i = i+2;
root = tmp.
poll()
;//這裡層次遍歷太妙了
}return prootoftree;}}
// your codec object will be instantiated and called as such:
// codec codec = new codec();
// codec.deserialize(codec.serialize(root));
陣列轉換成鍊錶。
list kk = new linkedlist<>(arrays.aslist(strs));
劍指offer 序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹。首先得理解題目的意思,序列化就是返回乙個帶有 和逗號的字串。反序列化就是根據帶有 和逗號的字串返回一棵二叉樹。比如對於二叉樹 1 2 3 4 5 6 7來講,序列化的結果是1,2,3,4,7,5,而反序列化的結果則是輸出一棵二叉樹。public cla...
劍指Offer 序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹 根據前面的面試題重建二叉樹,我們知道可以從前序遍歷和中序遍歷構造出一棵二叉樹。受此啟發,我們可以先把一棵二叉樹序列化成乙個前序遍歷序列和乙個中序序列的結合,然後再反序列化時通過這兩個序列重構出原二叉樹。但是這個思路有兩個缺點。乙個缺點是該方法要求二叉樹...
劍指offer 序列化二叉樹
請實現兩個函式,分別用來序列化和反序列化二叉樹 首先這道題目是要有兩個問題,第乙個是把一棵二叉樹按照前序遍歷的方式變成乙個字串。第二個是把乙個字串變成乙個二叉樹。對於第乙個問題來說,我們要對這棵樹進行乙個前序遍歷,按照中左右的方式放入列表中,如果節點為空,則插入 最後.join 來實現列表到字串的轉...