国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

想要精通算法和SQL的成長(zhǎng)之路 - 二叉樹的序列化和反序列化問(wèn)題

這篇具有很好參考價(jià)值的文章主要介紹了想要精通算法和SQL的成長(zhǎng)之路 - 二叉樹的序列化和反序列化問(wèn)題。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

前言

想要精通算法和SQL的成長(zhǎng)之路 - 系列導(dǎo)航

一. 二叉樹的層序遍歷(BFS)

二叉樹的層序遍歷
想要精通算法和SQL的成長(zhǎng)之路 - 二叉樹的序列化和反序列化問(wèn)題,精通算法和SQL之路,算法,sql,linux
像這種從上至下并且按層打印的,可以稱之為二叉樹的廣度優(yōu)先搜索(BFS。而這類算法往往借助隊(duì)列的一個(gè)先入先出特性來(lái)實(shí)現(xiàn)。

那么有這么幾個(gè)步驟:
1.特殊處理還有初始化動(dòng)作。

List<List<Integer>> res = new ArrayList<>();
// 樹為空,返回空數(shù)組
if (root == null) {
    return res;
}
// 初始化隊(duì)列
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);

2.BFS循環(huán):

while (!queue.isEmpty()) {
    // 該層的打印結(jié)果
    ArrayList<Integer> tmp = new ArrayList<>();
    // 將當(dāng)前層(隊(duì)列內(nèi)的元素)全部打印
    for (int i = queue.size(); i > 0; i--) {
        // 隊(duì)首先出
        TreeNode node = queue.poll();
        tmp.add(node.val);
        // 從左往右添加元素(先進(jìn)先出)
        if (node.left != null) {
            tmp.add(node.left.val);
        }
        if (node.right != null) {
            tmp.add(node.right.val);
        }
    }
    // 當(dāng)前層的遍歷結(jié)果加入到最終結(jié)果集中
    res.add(tmp);
}

最終完整代碼如下:

public List<List<Integer>> levelOrder(TreeNode root) {
    List<List<Integer>> res = new ArrayList<>();
    // 樹為空,返回空數(shù)組
    if (root == null) {
        return res;
    }
    // 初始化隊(duì)列
    LinkedList<TreeNode> queue = new LinkedList<>();
    queue.add(root);
    while (!queue.isEmpty()) {
        // 該層的打印結(jié)果
        ArrayList<Integer> tmp = new ArrayList<>();
        // 將當(dāng)前層(隊(duì)列內(nèi)的元素)全部打印
        for (int i = queue.size(); i > 0; i--) {
            // 隊(duì)首先出
            TreeNode node = queue.poll();
            tmp.add(node.val);
            // 從左往右添加元素(先進(jìn)先出)
            if (node.left != null) {
                tmp.add(node.left.val);
            }
            if (node.right != null) {
                tmp.add(node.right.val);
            }
        }
        // 當(dāng)前層的遍歷結(jié)果加入到最終結(jié)果集中
        res.add(tmp);
    }
    return res;
}

二. 二叉樹的序列化與反序列化

原題鏈接
想要精通算法和SQL的成長(zhǎng)之路 - 二叉樹的序列化和反序列化問(wèn)題,精通算法和SQL之路,算法,sql,linux
從題目來(lái)看,序列化的操作就是:從上往下,從左往右的一個(gè)層級(jí)遍歷。那么在做這個(gè)題目之前,我們可以看下這個(gè)題目:

那么我們回歸本題,本題和1.1小節(jié)的題目有啥不同?

  • 如果是空節(jié)點(diǎn),我們要輸出null
  • 我們還要根據(jù)序列化的結(jié)果,反序列化回一顆二叉樹。

我們依舊可以使用隊(duì)列來(lái)解決。

2.1 序列化操作

首先,特判以及隊(duì)列的初始化操作:

if (root == null) {
    return "[]";
}
StringBuilder res = new StringBuilder("[");
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);

順帶提一嘴,希望大家養(yǎng)成良好的編碼習(xí)慣,關(guān)于字符串的equal比較,常量放在前面,變量放后面,避免不必要的空指針。

BFS遞歸操作:

while (!queue.isEmpty()) {
    // 隊(duì)列先進(jìn)先出,從隊(duì)首開始出隊(duì)
    for (int i = queue.size(); i > 0; i--) {
        TreeNode node = queue.poll();
        // 只不過(guò)這里多加了一個(gè)判斷而已,如果是空節(jié)點(diǎn),我們添加null
        if (node == null) {
            res.append("null,");
            continue;
        }
        // 否則,非空,添加當(dāng)前節(jié)點(diǎn)的值
        res.append(node.val + ",");
        // 由于上面已經(jīng)加了null的判斷了,這里直接按順序先加左節(jié)點(diǎn),再加右節(jié)點(diǎn)即可。
        queue.add(node.left);
        queue.add(node.right);
    }
}

最后就是收尾工作:我們對(duì)于結(jié)尾的值,要把多余的逗號(hào)去除。

// 刪除最后一個(gè)多余的逗號(hào)
res.deleteCharAt(res.length() - 1);
res.append("]");
return res.toString();

最終完整代碼如下:

public String serialize(TreeNode root) {
    if (root == null) {
        return "[]";
    }
    StringBuilder res = new StringBuilder("[");
    LinkedList<TreeNode> queue = new LinkedList<>();
    queue.add(root);
    while (!queue.isEmpty()) {
        // 隊(duì)列先進(jìn)先出,從隊(duì)首開始出隊(duì)
        for (int i = queue.size(); i > 0; i--) {
            TreeNode node = queue.poll();
            // 只不過(guò)這里多加了一個(gè)判斷而已,如果是空節(jié)點(diǎn),我們添加null
            if (node == null) {
                res.append("null,");
                continue;
            }
            // 否則,非空,添加當(dāng)前節(jié)點(diǎn)的值
            res.append(node.val + ",");
            // 由于上面已經(jīng)加了null的判斷了,這里直接按順序先加左節(jié)點(diǎn),再加右節(jié)點(diǎn)即可。
            queue.add(node.left);
            queue.add(node.right);
        }
    }
    // 刪除最后一個(gè)多余的逗號(hào)
    res.deleteCharAt(res.length() - 1);
    res.append("]");
    return res.toString();
}

2.2 反序列化操作

同樣地,特判以及隊(duì)列的初始化操作:

if ("[]".equals(data)) {
    return null;
}
// 各個(gè)節(jié)點(diǎn)的值
String[] vals = data.substring(1, data.length() - 1).split(",");
// 第一個(gè)值必定是根節(jié)點(diǎn)(從上往下的特性)
TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
LinkedList<TreeNode> queue = new LinkedList<TreeNode>() {{
    add(root);
}};

BFS操作:

int index = 1;
while (!queue.isEmpty()) {
    TreeNode node = queue.poll();
    // 處理左節(jié)點(diǎn)
    if (!"null".equals(vals[index])) {
        node.left = new TreeNode(Integer.parseInt(vals[index]));
        queue.add(node.left);
    }
    // 這里不管怎樣都是要往后移動(dòng)一位,如果是null,我們node.left就默認(rèn)是null了。
    index++;
    if (!"null".equals(vals[index])) {
        node.right = new TreeNode(Integer.parseInt(vals[index]));
        queue.add(node.right);
    }
    index++;
}

完整代碼:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-729060.html

public TreeNode deserialize(String data) {
    if ("[]".equals(data)) {
        return null;
    }
    String[] vals = data.substring(1, data.length() - 1).split(",");
    TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
    LinkedList<TreeNode> queue = new LinkedList<TreeNode>() {{
        add(root);
    }};
    int index = 1;
    while (!queue.isEmpty()) {
        TreeNode node = queue.poll();
        // 處理左節(jié)點(diǎn)
        if (!"null".equals(vals[index])) {
            node.left = new TreeNode(Integer.parseInt(vals[index]));
            queue.add(node.left);
        }
        // 這里不管怎樣都是要往后移動(dòng)一位,如果是null,我們node.left就默認(rèn)是null了。
        index++;
        if (!"null".equals(vals[index])) {
            node.right = new TreeNode(Integer.parseInt(vals[index]));
            queue.add(node.right);
        }
        index++;
    }
    return root;
}

到了這里,關(guān)于想要精通算法和SQL的成長(zhǎng)之路 - 二叉樹的序列化和反序列化問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 想要精通算法和SQL的成長(zhǎng)之路 - 滑動(dòng)窗口和大小根堆

    想要精通算法和SQL的成長(zhǎng)之路 - 滑動(dòng)窗口和大小根堆

    想要精通算法和SQL的成長(zhǎng)之路 - 系列導(dǎo)航 先來(lái)說(shuō)下大小根堆是什么: 大根堆:棧頂元素最大(上圖左側(cè)部分),棧底至棧頂元素值遞增。 小根堆:棧頂元素最?。ㄉ蠄D右側(cè)部分),棧底至棧頂元素值遞減。 在 Java 當(dāng)中,可以用什么來(lái)表示大小根堆? 小根堆: 大根堆: 大小

    2024年02月07日
    瀏覽(21)
  • 想要精通算法和SQL的成長(zhǎng)之路 - 分割數(shù)組的最大值

    想要精通算法和SQL的成長(zhǎng)之路 - 分割數(shù)組的最大值

    想要精通算法和SQL的成長(zhǎng)之路 - 系列導(dǎo)航 原題鏈接 首先面對(duì)這個(gè)題目,我們可以捕獲幾個(gè): 非負(fù)整數(shù)。 非空連續(xù)子數(shù)組。 那么我們假設(shè)分割后的子數(shù)組,和的最大值是 M ,對(duì)應(yīng)分割的子數(shù)組個(gè)數(shù)為 N 。他們之間必然存在以下關(guān)系: 分割的子數(shù)組個(gè)數(shù) N 越多,對(duì)應(yīng)的

    2024年02月07日
    瀏覽(30)
  • [C]二叉樹的實(shí)現(xiàn)——喵喵成長(zhǎng)記

    [C]二叉樹的實(shí)現(xiàn)——喵喵成長(zhǎng)記

    寶子,你不點(diǎn)個(gè)贊嗎?不評(píng)個(gè)論嗎?不收個(gè)藏嗎? 最后的最后,關(guān)注我,關(guān)注我,關(guān)注我,你會(huì)看到更多有趣的博客哦?。?! 喵喵喵,你對(duì)我真的很重要。 目錄 前言 二叉樹的定義 特殊的二叉樹 二叉樹的性質(zhì)(超級(jí)重要) 代碼實(shí)現(xiàn) 二叉樹的練習(xí)題 總結(jié) 二叉樹用C語(yǔ)言實(shí)現(xiàn)

    2024年02月04日
    瀏覽(21)
  • 算法D14 | 二叉樹1 | 144. 二叉樹的前序遍歷 145. 二叉樹的后序遍歷 94. 二叉樹的中序遍歷

    理論基礎(chǔ)? 需要了解?二叉樹的種類,存儲(chǔ)方式,遍歷方式?以及二叉樹的定義? 文章講解: 二叉樹既可以鏈?zhǔn)酱鎯?chǔ)(利用指針,類似棧和隊(duì)列),也可以用數(shù)組表示。 深度優(yōu)先遍歷 前序遍歷(遞歸法,迭代法) 中序遍歷(遞歸法,迭代法) 后序遍歷(遞歸法,迭代法)

    2024年02月20日
    瀏覽(19)
  • 算法刷題Day 16 二叉樹的最大深度+N叉樹的最大深度+二叉樹的最小深度+完全二叉樹的節(jié)點(diǎn)個(gè)數(shù)

    遞歸法 迭代法 使用層序的方法,相對(duì)比較好理解 遞歸法 迭代法 跟二叉樹的迭代差不多意思。 要想到是后序遍歷 遞歸法 先計(jì)算左右兩棵子樹的節(jié)點(diǎn)數(shù),再加和,用后序遍歷的方法 迭代法 迭代法用層序遍歷來(lái)處理 適用于完全二叉樹的優(yōu)化 完全二叉樹優(yōu)化方法沒自己想出來(lái)

    2024年02月17日
    瀏覽(33)
  • 【算法第十四天7.28】二叉樹的最大深度,二叉樹的最小深度 ,完全二叉樹的節(jié)點(diǎn)個(gè)數(shù)

    鏈接 力扣104-二叉樹的最大深度 思路 鏈接 力扣111-二叉樹的最小深度 思路 鏈接 力扣222-完全二叉樹的節(jié)點(diǎn)個(gè)數(shù) 思路

    2024年02月14日
    瀏覽(48)
  • LeetCode算法二叉樹—222. 完全二叉樹的節(jié)點(diǎn)個(gè)數(shù)

    LeetCode算法二叉樹—222. 完全二叉樹的節(jié)點(diǎn)個(gè)數(shù)

    目錄 222. 完全二叉樹的節(jié)點(diǎn)個(gè)數(shù) - 力扣(LeetCode) 代碼: 運(yùn)行結(jié)果:? 給你一棵 ?完全二叉樹 ?的根節(jié)點(diǎn)? root ?,求出該樹的節(jié)點(diǎn)個(gè)數(shù)。 完全二叉樹?的定義如下:在完全二叉樹中,除了最底層節(jié)點(diǎn)可能沒填滿外,其余每層節(jié)點(diǎn)數(shù)都達(dá)到最大值,并且最下面一層的節(jié)點(diǎn)都集

    2024年02月07日
    瀏覽(30)
  • 數(shù)據(jù)結(jié)構(gòu)和算法學(xué)習(xí)記錄——平衡二叉樹(基本介紹、平衡因子、平衡二叉樹的定義、平衡二叉樹的高度)

    數(shù)據(jù)結(jié)構(gòu)和算法學(xué)習(xí)記錄——平衡二叉樹(基本介紹、平衡因子、平衡二叉樹的定義、平衡二叉樹的高度)

    目錄 基本介紹 平衡因子 平衡二叉樹? 平衡二叉樹的高度? 什么是平衡二叉樹? 以一個(gè)例子來(lái)解釋一下: 搜索樹結(jié)點(diǎn)按不同的插入次序,將會(huì)導(dǎo)致不同的深度和平均查找長(zhǎng)度ASL ? 在二叉搜索樹中查找一個(gè)元素:? (a)要找到Jan,需要查找一次;要找到Feb,需要查找兩次;

    2023年04月26日
    瀏覽(40)
  • 二叉樹的非遞歸遍歷算法

    二叉樹的非遞歸遍歷算法

    二叉樹的遍歷是指訪問(wèn)二叉樹的每個(gè)結(jié)點(diǎn),且每個(gè)結(jié)點(diǎn)僅被訪問(wèn)一次。二叉樹的遍歷可按二叉樹的構(gòu)成以及訪問(wèn)結(jié)點(diǎn)的順序分為4種方式:先序遍歷、中序遍歷、后序遍歷和層次遍歷。請(qǐng)至少給出其中一種遍歷方式的非遞歸算法的思路和代碼,并舉例演示算法的執(zhí)行過(guò)程。 算

    2023年04月24日
    瀏覽(19)
  • 算法刷題Day 15 二叉樹的層序遍歷+翻轉(zhuǎn)二叉樹+對(duì)稱二叉樹

    層序遍歷二叉樹需要借助到隊(duì)列 遞歸方法 迭代方法 就是簡(jiǎn)單的用上前序遍歷迭代方法實(shí)現(xiàn),不用想的太復(fù)雜 遞歸方法 迭代方法 這里使用了隊(duì)列來(lái)存放兩個(gè)要比較的結(jié)點(diǎn)。也可以使用棧,方法是類似的。

    2024年02月12日
    瀏覽(53)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包