[LintCode] Serialize and Deserialize Binary Tree(二叉樹(shù)的序列化和反序列化)

描述

設(shè)計(jì)一個(gè)算法圈澈,并編寫(xiě)代碼來(lái)序列化和反序列化二叉樹(shù)痘昌。將樹(shù)寫(xiě)入一個(gè)文件被稱(chēng)為“序列化”茂嗓,讀取文件后重建同樣的二叉樹(shù)被稱(chēng)為“反序列化”餐茵。

如何反序列化或序列化二叉樹(shù)是沒(méi)有限制的,你只需要確笔鑫可以將二叉樹(shù)序列化為一個(gè)字符串忿族,并且可以將字符串反序列化為原來(lái)的樹(shù)結(jié)構(gòu)。

對(duì)二進(jìn)制樹(shù)進(jìn)行反序列化或序列化的方式?jīng)]有限制蝌矛,LintCode將您的serialize輸出作為deserialize的輸入道批,它不會(huì)檢查序列化的結(jié)果。

樣例

給出一個(gè)測(cè)試數(shù)據(jù)樣例朴读, 二叉樹(shù){3,9,20,#,#,15,7}屹徘,表示如下的樹(shù)結(jié)構(gòu):

? 3

/ \

9? 20

? /? \

15? 7

我們的數(shù)據(jù)是進(jìn)行 BFS 遍歷得到的。當(dāng)你測(cè)試結(jié)果 wrong answer時(shí)衅金,你可以作為輸入調(diào)試你的代碼。

你可以采用其他的方法進(jìn)行序列化和反序列化簿煌。

代碼

GitHub 的源代碼氮唯,請(qǐng)?jiān)L問(wèn)下面的鏈接:

https://github.com/cwiki-us/java-tutorial/blob/master/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0007SerializeAndDeserialize.java

package com.ossez.lang.tutorial.tests.lintcode;

import java.util.ArrayList;

import org.junit.Test;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import com.ossez.lang.tutorial.models.TreeNode;

/**

* <p>

* 7

* <ul>

* <li>@see <a href=

* "https://www.cwiki.us/display/ITCLASSIFICATION/Serialize+and+Deserialize+Binary+Tree">https://www.cwiki.us/display/ITCLASSIFICATION/Serialize+and+Deserialize+Binary+Tree</a>

* <li>@see<a href=

* "https://www.lintcode.com/problem/serialize-and-deserialize-binary-tree">https://www.lintcode.com/problem/serialize-and-deserialize-binary-tree</a>

* </ul>

* </p>

*

* @author YuCheng

*

*/

public class LintCode0007SerializeAndDeserialize {

? private final static Logger logger = LoggerFactory.getLogger(LintCode0007SerializeAndDeserialize.class);

? /**

? *

? */

? @Test

? public void testMain() {

? ? logger.debug("BEGIN");

? ? String data = "{3,9,20,#,#,15,7}";

? ? System.out.println(serialize(deserialize(data)));

? }

? /**

? * Deserialize from array to tree

? *

? * @param data

? * @return

? */

? private TreeNode deserialize(String data) {

? ? // NULL CHECK

? ? if (data.equals("{}")) {

? ? ? return null;

? ? }

? ? ArrayList<TreeNode> treeList = new ArrayList<TreeNode>();

? ? data = data.replace("{", "");

? ? data = data.replace("}", "");

? ? String[] vals = data.split(",");

? ? // INSERT ROOT

? ? TreeNode root = new TreeNode(Integer.parseInt(vals[0]));

? ? treeList.add(root);

? ? int index = 0;

? ? boolean isLeftChild = true;

? ? for (int i = 1; i < vals.length; i++) {

? ? ? if (!vals[i].equals("#")) {

? ? ? ? TreeNode node = new TreeNode(Integer.parseInt(vals[i]));

? ? ? ? if (isLeftChild) {

? ? ? ? ? treeList.get(index).left = node;

? ? ? ? } else {

? ? ? ? ? treeList.get(index).right = node;

? ? ? ? }

? ? ? ? treeList.add(node);

? ? ? }

? ? ? // LEVEL

? ? ? if (!isLeftChild) {

? ? ? ? index++;

? ? ? }

? ? ? // MOVE TO RIGHT OR NEXT LEVEL

? ? ? isLeftChild = !isLeftChild;

? ? }

? ? return root;

? }

? /**

? *

? * @param root

? * @return

? */

? public String serialize(TreeNode root) {

? ? // write your code here

? ? if (root == null) {

? ? ? return "{}";

? ? }

? ? ArrayList<TreeNode> queue = new ArrayList<TreeNode>();

? ? queue.add(root);

? ? for (int i = 0; i < queue.size(); i++) {

? ? ? TreeNode node = queue.get(i);

? ? ? if (node == null) {

? ? ? ? continue;

? ? ? }

? ? ? queue.add(node.left);

? ? ? queue.add(node.right);

? ? }

? ? while (queue.get(queue.size() - 1) == null) {

? ? ? queue.remove(queue.size() - 1);

? ? }

? ? StringBuilder sb = new StringBuilder();

? ? sb.append("{");

? ? sb.append(queue.get(0).val);

? ? for (int i = 1; i < queue.size(); i++) {

? ? ? if (queue.get(i) == null) {

? ? ? ? sb.append(",#");

? ? ? } else {

? ? ? ? sb.append(",");

? ? ? ? sb.append(queue.get(i).val);

? ? ? }

? ? }

? ? sb.append("}");

? ? return sb.toString();

? }

}



點(diǎn)評(píng)

本題目主要需要你對(duì)二叉樹(shù)的遍歷方法有所了解。

遍歷二叉樹(shù)主要有 2 類(lèi)方法姨伟,分別為深度優(yōu)先(DFS)和廣度優(yōu)先(BFS)惩琉。

在深度優(yōu)先中,你有又可以使用前序夺荒,中序和后序搜索方法瞒渠,你可以使用遞歸或者非遞歸算法實(shí)現(xiàn)。對(duì)于廣度優(yōu)先算法技扼,一般都會(huì)采用非遞歸的實(shí)現(xiàn)方法進(jìn)行實(shí)現(xiàn)伍玖。

https://blog.ossez.com/archives/2601

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市剿吻,隨后出現(xiàn)的幾起案子窍箍,更是在濱河造成了極大的恐慌,老刑警劉巖丽旅,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椰棘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡榄笙,警方通過(guò)查閱死者的電腦和手機(jī)邪狞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)茅撞,“玉大人帆卓,你說(shuō)我怎么就攤上這事巨朦。” “怎么了鳞疲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵罪郊,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我尚洽,道長(zhǎng)悔橄,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任腺毫,我火速辦了婚禮癣疟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘潮酒。我一直安慰自己睛挚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布急黎。 她就那樣靜靜地躺著扎狱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪勃教。 梳的紋絲不亂的頭發(fā)上淤击,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音故源,去河邊找鬼污抬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛绳军,可吹牛的內(nèi)容都是我干的印机。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼门驾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼射赛!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起猎唁,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咒劲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后诫隅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體腐魂,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年逐纬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛔屹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豁生,死狀恐怖兔毒,靈堂內(nèi)的尸體忽然破棺而出漫贞,到底是詐尸還是另有隱情,我是刑警寧澤育叁,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布迅脐,位于F島的核電站,受9級(jí)特大地震影響豪嗽,放射性物質(zhì)發(fā)生泄漏谴蔑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一龟梦、第九天 我趴在偏房一處隱蔽的房頂上張望隐锭。 院中可真熱鬧,春花似錦计贰、人聲如沸钦睡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)荞怒。三九已至,卻和暖如春秧秉,著一層夾襖步出監(jiān)牢的瞬間挣输,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工福贞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人停士。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓挖帘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親恋技。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拇舀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 描述 給出一棵二叉樹(shù),返回其節(jié)點(diǎn)值的層次遍歷(逐層從左往右訪(fǎng)問(wèn)) 樣例 給一棵二叉樹(shù){3,9,20,#,#,15,...
    HoneyMoose閱讀 172評(píng)論 0 0
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)蜻底。 張土汪:刷leetcod...
    土汪閱讀 12,737評(píng)論 0 33
  • 描述 設(shè)計(jì)一個(gè)算法骄崩,并編寫(xiě)代碼來(lái)序列化和反序列化二叉樹(shù)。將樹(shù)寫(xiě)入一個(gè)文件被稱(chēng)為“序列化”薄辅,讀取文件后重建同樣的二叉...
    6默默Welsh閱讀 5,614評(píng)論 0 0
  • 我發(fā)現(xiàn)我早已經(jīng)長(zhǎng)大 我發(fā)現(xiàn)我早不說(shuō)謊話(huà) 要拂? 你呢
    那難得閱讀 152評(píng)論 0 0
  • 12.24書(shū)籍名稱(chēng)《這樣讀書(shū)就夠了》P187 【day13橘子哥】 我們通常情況下,將所有致用類(lèi)書(shū)籍分成四類(lèi)站楚。 1...
    馬克圖布了閱讀 144評(píng)論 0 0