精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

我們一起聊聊序列化二叉樹

開發 前端
當我們用前序遍歷來讀取二叉樹時,得到的序列是從根節點開始的,那么反序列化時在根節點讀取出來之后就可以開始了。當我們在序列化的時候可能會遇到空節點,我們用一個特殊的字符來標記它(例如"$")。

前言

有一顆二叉樹,將它轉換成特定規則的字符串就稱之為序列化,將序列化后的字符串按照序列化時的規則還原成二叉樹就稱之為反序列化。

那么如何實現二叉樹與字符串之間的相互轉換呢?本文就跟大家分享下這個問題的解決方案,歡迎各位感興趣的開發者閱讀本文。

實現思路

在文章重建二叉樹中,我們學會了利用前序遍歷序列和中序遍歷序列將一個字符串構建成一顆二叉樹。這個思路有兩個缺點:

  • 二叉樹中不能有數值重復的節點
  • 只有當兩個序列中所有的數據都讀出來后才能開始反序列化(如果兩個序列中的數據都是從一個流里讀出來的,那么就需要等待比教長的時間)

其實,當我們用前序遍歷來讀取二叉樹時,得到的序列是從根節點開始的,那么反序列化時在根節點讀取出來之后就可以開始了。當我們在序列化的時候可能會遇到空節點,我們用一個特殊的字符來標記它(例如"$")。節點值之間的連接也需要用特殊字符標記(例如",")。

序列化的規則捋清楚后,我們舉個例子來驗證下是否可行,如下所示(一顆二叉樹):

圖片

根據上面定義的規則,我們使用前序遍歷得到的序列為:1,2,4,$,$,$,3,5,$,$,6,$,$。

圖片

經過驗證,上述方法成功的實現了樹的序列化。接下來我們以字符串1,2,4,$,$,$,3,5,$,$,6,$,$為例分析如何反序列化二叉樹。

第一個讀出的數字是1。由于前序遍歷是從根節點開始的,這是根節點的值。緊接著讀出的數字是2,根據前序遍歷的規則,這是根節點的左子節點的值。同樣的,接下來的數字4是值為2的節點的左子節點。

圖片

接著從序列化字符串里讀出兩個字符"$",這表明節點4的左、右子節點均為空,因此它是一個葉節點。

圖片

接下來返回至節點2,重建它的右子節點。繼續讀取字符,下一個字符是"$",這表明節點2的右子節點為空。這個節點的左、右子樹都已經構建完畢。

圖片

接下來返回至根節點,反序列化根節點的右子樹。

下一個序列化字符串中讀取出來的數字是3,因此根節點的右子樹的值為3。它的左子節點是一個值為5的葉節點,因為接下來的三個字符是"5,$,$"。

圖片

同樣,它的右子節點是值為6的葉節點,因為最后3個字符是"6,$,$"。

圖片

字符串中的所有字符已讀取完畢,序列化流程結束,樹也完成重建,如下圖所示(去掉了分析思路時所畫的輔助線)

圖片

實現代碼

經過前面的分析,我們已經得到了完整的思路,接下來我們來看下代碼的實現。

序列化二叉樹

我們利用前序遍歷即可完成二叉樹的序列化。

  public serialize(root: BinaryTreeNode | null): string {
// 空節點用$表示
if (root == null) return "$";
const result: serializeNode = { nodeVal: "" };
this.serializeFn(root, result);
// 末尾會有多余的分隔符,將其去除
return result.nodeVal.substring(0, result.nodeVal.length - 1);
}


/**
* 處理樹序列化的實現函數
* @param root 樹的根節點
* @param strObj 序列化后的節點對象
* @private
*/
private serializeFn(
root: BinaryTreeNode | null | undefined,
strObj: serializeNode
) {
if (root == null) {
strObj.nodeVal += "$,";
return;
}
strObj.nodeVal += root.key + ",";
this.serializeFn(root.left, strObj);
this.serializeFn(root.right, strObj);
}

反序列化

我們序列化的時候用的前序遍歷,同樣的在反序列化的時候也要使用前序遍歷。反序列的時候稍微麻煩些,需要先把字符串中的每個字符放到數組中。隨后再按照我們前面的分析:

  • 定義一個全局變量across用來表示當前讀取到了第幾個字符(已走步長)
  • 遞歸執行構建函數時,已走步長先自增。
  • 根節點的左子樹一定是緊根其后的字符,所以從index+1位置開始繼續執行遞歸函數直至遇到"$"字符為止
  • 根節點的右子樹一定是緊根在它左子樹之后的字符,所以從across位置開始繼續執行遞歸函數直至遇到"$"字符為止
  • 構建函數接受兩個參數:字符數組、當前讀取的字符索引
  • 從字符數組中讀取當前字符索引位置的值,構建根節點
  • 左、右子樹都構建完畢后,將構建好的根節點返回就得到了一顆完整的樹
  /**
* 反序列化二叉樹
* @param treeStr
*/
public deserialize(treeStr: string): BinaryTreeNode | null {
if (treeStr === "$") {
return null;
}
return this.deserializeFn(treeStr);
}

/**
* 處理樹的反序列化實現函數
* @param nodeStrVal 反序列化后的樹節點字符串
* @private
*/
private deserializeFn(nodeStrVal: string) {
// 讀取字符串的每一個字符,將其轉換為數組
const strArr: Array<string> = [];
let readIndex = 0;
while (readIndex < nodeStrVal.length) {
if (nodeStrVal.charAt(readIndex) !== ",") {
strArr.push(nodeStrVal.charAt(readIndex));
}
readIndex++;
}
// 反序列化二叉樹
return this.buildTree(strArr, 0);
}

/**
* 將字符串數組序列化為二叉樹
* @param str 字符串數組
* @param index 起始索引
* @private
*/
private buildTree(str: Array<string>, index: number) {
this.across++;
// 處理空節點(遞歸的基線條件)
if (str[index] === "$") return null;
// 構造樹節點
const treeNode: BinaryTreeNode = { key: parseInt(str[index]) };
// 當前節點的下一個節點一定為它的左子樹
treeNode.left = this.buildTree(str, index + 1);
// 左子樹遇到基線條件后,右子樹的索引就為已走步長
treeNode.right = this.buildTree(str, this.across);
return treeNode;
}

測試用例

我們用文章開頭所列舉的例子來驗證下上述代碼能否正確的解決問題。

const rootNode: BinaryTreeNode = {
key: 1,
left: {
key: 2,
left: {
key: 4
}
},
right: {
key: 3,
left: {
key: 5
},
right: {
key: 6
}
}
};

const serializedBinaryTree = new SerializedBinaryTree();
const treeStr = serializedBinaryTree.serialize(rootNode);
console.log("序列化后的字符串", treeStr);
const result = serializedBinaryTree.deserialize(treeStr);
console.log("反序列化后的樹", result);

執行結果如下所示。

圖片

示例代碼

本文用到的代碼完整版請移步:

  • SerializedBinaryTree.ts
  • SerializedBinaryTree-test.ts
責任編輯:武曉燕 來源: 神奇的程序員
相關推薦

2023-05-04 07:30:28

二叉搜索樹BST

2024-01-30 13:32:51

JSON反序列化序列化

2022-10-26 23:58:02

二叉樹數組算法

2021-10-12 09:25:11

二叉樹樹形結構

2020-04-27 07:05:58

二叉樹左子樹右子樹

2021-12-03 09:16:03

二叉樹打印平衡

2023-06-09 07:48:20

數字化轉型工具

2023-01-04 18:10:26

服務模塊化jre

2024-01-02 09:09:03

枚舉規范化管理

2021-05-06 17:46:30

二叉樹數據結構

2021-11-28 23:54:28

子樹B結構

2024-02-20 21:34:16

循環GolangGo

2021-08-27 07:06:10

IOJava抽象

2023-06-30 08:18:51

敏捷開發模式

2022-05-24 08:21:16

數據安全API

2023-08-10 08:28:46

網絡編程通信

2023-08-04 08:20:56

DockerfileDocker工具

2023-09-10 21:42:31

2021-04-19 07:47:42

數據結構二叉樹Tree

2021-04-20 08:37:14

數據結構二叉樹
點贊
收藏

51CTO技術棧公眾號

中文字幕一区二区三区久久网站| 成人啊v在线| 成人免费视频一区| 97欧美精品一区二区三区| 性欧美丰满熟妇xxxx性久久久| 中文在线8资源库| 国产精品久久99| av色综合网| 国产精品无码粉嫩小泬| 欧美人成在线| 在线亚洲男人天堂| 国产人妻黑人一区二区三区| 外国电影一区二区| 亚洲成av人片在线观看| 亚洲资源在线网| 日本毛片在线观看| 精品在线免费观看| 人人爽久久涩噜噜噜网站| 国产免费久久久久| 精品产国自在拍| 亚洲第一区第二区| 亚洲无在线观看| 东京热一区二区三区四区| 久久大综合网| 亚洲网站在线看| 95视频在线观看| av日韩一区| 精品视频1区2区| 国产日产欧美视频| 毛片在线导航| 国产精品毛片无遮挡高清| 久久久久九九九| 黄片毛片在线看| 国产一区福利在线| 国产女精品视频网站免费| 岛国av中文字幕| 99在线|亚洲一区二区| 欧美国产极速在线| 欧美日韩在线观看免费| 婷婷激情综合| 日韩在线视频网| 精品成人无码一区二区三区| 亚洲精品一级二级三级| 亚洲第一av网| 黄色网址在线视频| 成人av资源网址| 亚洲精品在线免费观看视频| 一级黄色免费毛片| 亚洲日本va中文字幕| 日韩区在线观看| 性高潮久久久久久| 日韩精品一区二区三区中文字幕| 制服丝袜成人动漫| 韩国三级丰满少妇高潮| 欧洲一区在线| 欧美岛国在线观看| 日本一级大毛片a一 | 成人久久一区二区| 一级黄色片免费看| 韩国三级在线一区| 91在线视频精品| 精品久久人妻av中文字幕| 国产乱子轮精品视频| www.成人av| 欧美少妇bbw| 国产一区免费电影| 亚洲在线免费视频| 亚洲女同志亚洲女同女播放| 国产suv精品一区二区883| 国产精品日韩欧美一区二区| 欧美视频一二区| 久久蜜桃一区二区| 少妇精品久久久久久久久久| 午夜伦全在线观看| 亚洲精品视频在线看| 欧美乱做爰xxxⅹ久久久| 狠狠操一区二区三区| 色拍拍在线精品视频8848| 亚洲色图 在线视频| 3d动漫一区二区三区在线观看| 欧美一区二区私人影院日本| 年下总裁被打光屁股sp| 日韩高清成人在线| 日韩中文字幕精品视频| 麻豆亚洲av熟女国产一区二 | 天堂网av成人| 自拍偷拍免费精品| 国产一级片播放| 首页欧美精品中文字幕| 成人在线国产精品| 五月婷婷深深爱| 国产精品久久久久影视| 免费人成自慰网站| 福利精品一区| 亚洲成人激情图| 波多野结衣欲乱| 国产毛片久久| 91免费欧美精品| 欧美91精品久久久久国产性生爱| 国产精品乱码一区二区三区软件| 免费特级黄色片| 国产成人精品一区二区三区在线 | 成人黄色在线免费| 少妇高潮久久久| 国产精品乱码妇女bbbb| 国产原创popny丨九色| 国语自产精品视频在线看抢先版结局| 欧美成人vr18sexvr| 国内精品卡一卡二卡三| 欧美三级网页| 成人激情视频在线观看| 天堂av网在线| 亚洲国产欧美一区二区三区丁香婷| 国产精品人人妻人人爽人人牛| 日韩精品免费视频一区二区三区 | 久草免费在线观看视频| 日本在线播放一区二区三区| 国产一区高清视频| 爆操欧美美女| 欧美男男青年gay1069videost| 真人bbbbbbbbb毛片| 欧美精品二区| 国产日韩视频在线观看| 免费在线黄色网址| 午夜欧美在线一二页| 一级黄色高清视频| 久久大综合网| 国产成人综合久久| 日韩电影在线观看完整版| 亚洲一区在线观看免费| 色黄视频免费看| 国产精品久久久久一区二区三区厕所| 国产成人一区二| 性高潮久久久久久久久久| 一个色综合网站| 日韩大尺度视频| 欧美va天堂在线| 亚洲xxx自由成熟| 自拍视频在线网| 欧美日韩三级一区| 快灬快灬一下爽蜜桃在线观看| 久久婷婷丁香| 日韩成人在线资源| 欧美va在线观看| 在线中文字幕日韩| 中文字幕日本人妻久久久免费| 国产三级一区二区三区| 三级视频中文字幕| 日韩欧美三级| 91免费精品视频| 色屁屁www国产馆在线观看| 日韩欧美国产综合在线一区二区三区| 顶臀精品视频www| 国产精品资源网站| 久久99久久99精品| 久久九九热re6这里有精品| 91av在线免费观看视频| 免费国产在线视频| 欧美视频一区二区三区四区| 欧美a在线播放| 精品一区二区三区影院在线午夜| 做爰高潮hd色即是空| 精品一区二区三区在线观看视频 | 亚洲乱码一区二区三区三上悠亚| 欧美日韩亚洲国产| www国产91| 成 人片 黄 色 大 片| 亚洲国产精品久久久久秋霞影院 | 欧美一级视频一区二区| 黄色av免费在线观看| 欧美日韩精品一区二区三区四区 | 欧美日韩激情小视频| 人人妻人人藻人人爽欧美一区| 日韩黄色一级片| 椎名由奈jux491在线播放| a看欧美黄色女同性恋| 2019中文字幕免费视频| 91视频在线观看| 日韩精品在线一区二区| wwwwww国产| 中文字幕一区二区三区乱码在线 | av综合网页| 国产精品va在线| 五月花成人网| 亚洲小视频在线| www.亚洲黄色| 日本高清不卡视频| 日韩影院一区二区| 国产精品一二三四区| 免费无码av片在线观看| 亚洲字幕久久| 欧美日韩电影一区二区| 婷婷成人激情| 亚洲福利影片在线| 一本到在线视频| 欧美日韩国产中字| 午夜激情福利网| 久久夜色精品国产欧美乱极品| 黄色一级片免费的| 亚洲欧美日韩国产综合精品二区 | 老司机午夜在线视频| 亚洲精品91美女久久久久久久| 中文字幕在线一| 五月天一区二区三区| 蜜桃av.com| 久久久精品国产免大香伊| 四虎国产精品免费| 麻豆成人久久精品二区三区红| 日日摸日日碰夜夜爽无码| 欧美激情黄色片| 欧美日韩喷水| 精品少妇一区| 99精彩视频| 少妇高潮一区二区三区99| 欧美中文在线视频| 国产偷倩在线播放| 久久久av网站| a天堂中文在线88| 亚洲免费一在线| 免费av一级片| 日韩视频一区二区三区 | 老司机精品视频导航| av网站在线观看不卡| 亚洲午夜极品| 喜爱夜蒲2在线| 久久久五月天| 欧美性视频在线播放| 凹凸成人精品亚洲精品密奴| 久久久久网址| 婷婷五月色综合香五月| 国精产品99永久一区一区| 日韩欧美中文字幕在线视频| 国产在线视频一区| 男人亚洲天堂| 国产精品网红福利| 国产精品原创视频| 国产精品久久久久77777| 日本免费久久| 国产97免费视| 日本综合视频| 国产精品久久久久久亚洲影视| 亚洲综合在线电影| 国产成人在线一区| yiren22亚洲综合| 国产精品免费电影| 久久亚洲国产精品尤物| 国产精品夜间视频香蕉| 九七影院97影院理论片久久| 国产久一一精品| 午夜不卡一区| 97se亚洲综合在线| 高清日韩中文字幕| 久久99欧美| 免费欧美激情| 亚洲人成77777| 亚洲精品成人影院| 国产传媒久久久| 国产精品久久777777毛茸茸| 国产精品丝袜久久久久久消防器材| 免费日韩av片| 亚洲色图 在线视频| 国产精品一区免费视频| 亚洲一区二区中文字幕在线观看| 国产福利精品导航| 国产又黄又粗又猛又爽的视频| 久久久久久久久99精品| 亚洲一区二区自偷自拍 | 成人黄色片免费| 亚洲精品影视| 国产一级不卡毛片| 国产在线精品国自产拍免费| 稀缺小u女呦精品呦| 久久人人爽爽爽人久久久| 91成人精品一区二区| 亚洲欧美日韩国产一区二区三区 | 欧美专区亚洲专区| 国产乱码精品一区二三区蜜臂| 精品捆绑美女sm三区| 久久精品蜜桃| 成年人精品视频| 一区二区电影免费观看| 国产一区香蕉久久| 免费日韩一区二区三区| 亚欧精品在线| 国内精品久久久久久久影视蜜臀| 国产成人a亚洲精v品无码| 久久国产精品72免费观看| 91九色蝌蚪porny| 中文字幕久久午夜不卡| 日本一区二区欧美| 欧美日韩一区二区三区在线看| 亚洲国产精品久久久久久6q| 亚洲欧洲黄色网| 在线视频观看国产| 国产精品av在线播放| 视频在线亚洲| 午夜午夜精品一区二区三区文| 亚洲网址在线| xxxx在线免费观看| 2020国产精品自拍| 久久久久无码国产精品不卡| 在线观看视频一区二区| 欧美 日韩 国产 精品| www.久久久久| 日韩在线免费| 蜜桃视频日韩| 欧美日韩一区二区国产| 中文字幕精品一区二区三区在线| 99精品偷自拍| 欧美国产日韩综合| 欧美另类久久久品| 噜噜噜在线观看播放视频| 久久欧美在线电影| 国产精品高清一区二区| 性欧美.com| 天堂一区二区在线| 69亚洲乱人伦| 洋洋av久久久久久久一区| 亚洲系列在线观看| 亚洲天堂精品在线| 新版的欧美在线视频| 国产chinese精品一区二区| 我不卡伦不卡影院| 亚洲精品久久久久久宅男| 久久久精品日韩欧美| 六月丁香婷婷综合| 亚洲二区在线播放视频| 国产精品69xx| 成人欧美一区二区三区在线观看| 99久久综合| 天堂av8在线| 亚洲三级免费电影| 91影院在线播放| 久久精品一区中文字幕| 久久国内精品| 亚洲图片小说在线| 久久激情综合网| 国产欧美小视频| 欧美日韩国产免费| 888av在线| 成人激情视频网| 女人天堂亚洲aⅴ在线观看| 色欲无码人妻久久精品| 亚洲你懂的在线视频| 国产视频在线观看免费| 欧美精品一区二区三区国产精品| 日本高清久久| 农民人伦一区二区三区| 99re这里都是精品| 天天爽夜夜爽人人爽| 91久久国产综合久久| 免费在线观看一级毛片| 国产精品xxx视频| 欧美日韩第一| 色婷婷一区二区三区av免费看| 亚洲视频在线观看一区| www.麻豆av| 午夜精品理论片| 国产剧情一区| 午夜免费福利在线| 亚洲四区在线观看| 亚洲成人精品女人久久久| 国内自拍欧美激情| 一本色道久久综合狠狠躁的番外| 国产男女激情视频| 一区二区中文字幕在线| 精品国产av一区二区三区| 欧美精品videosex性欧美| 日韩在线黄色| 在线观看国产福利| 亚洲第一福利一区| www在线免费观看| 亚洲999一在线观看www| 亚洲日本免费| 97人妻人人揉人人躁人人| 欧美电影一区二区| www.九色在线| 视频一区国产精品| 国产成人精品1024| 欧美一级淫片免费视频黄| 久久久国产精彩视频美女艺术照福利| 极品束缚调教一区二区网站 | 国产成人精品一区二区三区在线| 六月婷婷激情网| 久久综合一区二区| 91福利免费视频| 欧美亚洲国产日本| 亚洲蜜桃视频| 9.1成人看片| 欧美一区二区三区四区久久| 制服丝袜专区在线| 成人在线免费高清视频| 欧美激情中文不卡| 亚洲成熟女性毛茸茸| 国产精品96久久久久久| 极品尤物久久久av免费看| 欧美人与禽zoz0善交| 亚洲级视频在线观看免费1级| 电影91久久久| 日日碰狠狠躁久久躁婷婷|