精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

解析LeetCode第226號(hào)題目:反轉(zhuǎn)二叉樹

jf_78858299 ? 來源:小風(fēng)算法 ? 作者:小風(fēng)算法 ? 2023-02-17 14:52 ? 次閱讀

今天給大家講解一道微軟一面的算法題,也是LeetCode第226號(hào)題目,反轉(zhuǎn)二叉樹,就像這樣:

圖片

簡(jiǎn)單講就是把每個(gè)節(jié)點(diǎn)的左子樹和右子樹進(jìn)行交換

顯然,這需要我們能夠遍歷該二叉樹。

那么遍歷二叉樹就有兩種經(jīng)典的解法:深度優(yōu)先遍歷,Deep First Search,簡(jiǎn)稱DFS;另一個(gè)是廣度優(yōu)先遍歷,Breadth First Search,簡(jiǎn)稱BFS。

深度優(yōu)先搜索

顧名思義,深度優(yōu)先搜索是我總是優(yōu)先訪問“ 節(jié)點(diǎn)的子節(jié)點(diǎn)的子節(jié)點(diǎn) 。。”,這是什么意思呢?對(duì)于給定的二叉樹,我們首先訪問節(jié)點(diǎn)4:

圖片

接下來訪問4的左子樹2:

圖片

再接下來依然訪問2的左子樹1:

圖片

1是葉子節(jié)點(diǎn),其左右子樹都為空,因此返回上一個(gè)節(jié)點(diǎn)2,然后訪問其右子樹3,重復(fù)上述過程直到所有節(jié)點(diǎn)訪問完畢。

你會(huì)發(fā)現(xiàn),這其實(shí)是一個(gè)遞歸過程:

圖片

深度優(yōu)先搜索非常適合用遞歸代碼編寫。

回到這個(gè)題目,代碼就可以這樣寫:

TreeNode* invertTree(TreeNode* root) {
    // 如果是空節(jié)點(diǎn),直接訪問
    if (root == nullptr) return nullptr;
    
    // 找到當(dāng)前節(jié)點(diǎn)的左右字節(jié)點(diǎn),并交換
    auto* left = root->left;
    auto* right = root->right;
    root->left = right;
    root->right = left;
    
    // 處理當(dāng)前節(jié)點(diǎn)的左右子節(jié)點(diǎn)
    invertTree(left);
    invertTree(right);
    
    return root;
}

接下來我們看廣度優(yōu)先搜索。

廣度優(yōu)先搜索

個(gè)人認(rèn)為廣度優(yōu)先搜索相對(duì)來說更容易理解,通俗的講,廣度優(yōu)先搜索是“ 先把同輩訪問完再訪問下一輩 ”,因此這一種“ 層級(jí) ”遍歷方法,先是訪問第一層,然后是第二層。。直到最后一層,就像這樣:

圖片

在這里我們可以使用一個(gè)隊(duì)列,先把根節(jié)點(diǎn)4放入隊(duì)列中,然后從隊(duì)列依次取出節(jié)點(diǎn),交換其左右字?jǐn)?shù),并將該節(jié)點(diǎn)的左右字?jǐn)?shù)也放到隊(duì)列中,重復(fù)上述過程直到隊(duì)列為空,用代碼就是這樣實(shí)現(xiàn):

TreeNode* invertTree(TreeNode* root) {
  if (root == nullptr) return nullptr;
  
  // 定義隊(duì)列,并把根節(jié)點(diǎn)放到隊(duì)列中
  queue q;
  q.push(root);
  
  while(!q.empty()) {
    // 從隊(duì)列中取出節(jié)點(diǎn)
    auto* t = q.front();
    q.pop();

    // 交換該節(jié)點(diǎn)的左右子樹
    auto* left = t->left;
    auto* right = t->right;
    t->left = right;
    t->right = left;
    
    // 如果該節(jié)點(diǎn)的左右子樹不空則放到隊(duì)列
    if (left) q.push(left);
    if (right) q.push(right);
  }
  return root;
}

廣度優(yōu)先搜索與深度優(yōu)先搜索不僅僅可以用在二叉樹中,這兩種遍歷方法有著極其廣泛的用途,當(dāng)我們積攢足夠多的使用案例后將會(huì)系統(tǒng)總結(jié)這兩種遍歷方法。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 微軟
    +關(guān)注

    關(guān)注

    4

    文章

    6516

    瀏覽量

    103599
  • 二叉樹
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    12283
  • BFS
    BFS
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    2149
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    計(jì)算機(jī)級(jí)二叉樹的問題

    各位大神,本人馬上要考計(jì)算機(jī)級(jí)了,那個(gè)二叉樹老是弄不明白,比如一個(gè)題目,一棵二叉樹共有25個(gè)節(jié)點(diǎn),其中五個(gè)葉子節(jié)點(diǎn),則度為1的節(jié)點(diǎn)數(shù)為?
    發(fā)表于 09-04 09:45

    基于二叉樹的時(shí)序電路測(cè)試序列設(shè)計(jì)

    為了實(shí)現(xiàn)時(shí)序電路狀態(tài)驗(yàn)證和故障檢測(cè),需要事先設(shè)計(jì)一個(gè)輸入測(cè)試序列。基于二叉樹節(jié)點(diǎn)和樹枝的特性,建立時(shí)序電路狀態(tài)二叉樹,按照電路二叉樹節(jié)點(diǎn)(狀態(tài))與樹枝(輸入)的層次邏輯
    發(fā)表于 07-12 13:57 ?0次下載
    基于<b class='flag-5'>二叉樹</b>的時(shí)序電路測(cè)試序列設(shè)計(jì)

    二叉樹層次遍歷算法的驗(yàn)證

    實(shí)現(xiàn)二叉樹的層次遍歷算法,并對(duì)用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”創(chuàng)建的二叉樹進(jìn)行測(cè)試。
    發(fā)表于 11-28 01:05 ?2023次閱讀
    <b class='flag-5'>二叉樹</b>層次遍歷算法的驗(yàn)證

    關(guān)于二叉樹一些數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目

    最近總結(jié)了一些數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目,這是第一篇文章,關(guān)于二叉樹的。
    的頭像 發(fā)表于 02-07 13:57 ?3117次閱讀

    詳解電源二叉樹到底是什么

    作為數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ),分很多種,像 AVL 、紅黑二叉搜索....今天我想分享的是關(guān)于二叉樹
    的頭像 發(fā)表于 06-06 15:05 ?9779次閱讀
    詳解電源<b class='flag-5'>二叉樹</b>到底是什么

    二叉樹操作的相關(guān)知識(shí)和代碼詳解

    見的二叉樹操作作個(gè)總結(jié): 前序遍歷,中序遍歷,后序遍歷; 層次遍歷; 求的結(jié)點(diǎn)數(shù); 求的葉子數(shù); 求的深度; 求二叉樹
    的頭像 發(fā)表于 12-12 11:04 ?1947次閱讀
    <b class='flag-5'>二叉樹</b>操作的相關(guān)知識(shí)和代碼詳解

    二叉樹的前序遍歷非遞歸實(shí)現(xiàn)

    我們之前說了二叉樹基礎(chǔ)及二叉的幾種遍歷方式及練習(xí)題,今天我們來看一下二叉樹的前序遍歷非遞歸實(shí)現(xiàn)。 前序遍歷的順序是, 對(duì)于中的某節(jié)點(diǎn),先遍歷該節(jié)點(diǎn),然后再遍歷其左子樹,最后遍歷其右子
    的頭像 發(fā)表于 05-28 13:59 ?1857次閱讀

    如何才能夠翻轉(zhuǎn)二叉樹

    有所收獲! 226.翻轉(zhuǎn)二叉樹題目地址:https://leetcode-cn.com/problems/invert-binary-tree/ 翻轉(zhuǎn)一棵
    的頭像 發(fā)表于 09-01 11:45 ?1668次閱讀

    C語言數(shù)據(jù)結(jié)構(gòu):什么是二叉樹

    完全二叉樹:完全二叉樹是效率很高的數(shù)據(jù)結(jié)構(gòu)。對(duì)于深度為K,有n個(gè)節(jié)點(diǎn)的二叉樹,當(dāng)且僅當(dāng)每一個(gè)節(jié)點(diǎn)都與深度為K的滿二叉樹中編號(hào)從1至n的節(jié)點(diǎn)一一對(duì)應(yīng)時(shí),稱為完全
    的頭像 發(fā)表于 04-21 16:20 ?2325次閱讀

    怎么就能構(gòu)造成二叉樹呢?

    一直跟著公眾號(hào)學(xué)算法的錄友 應(yīng)該知道,我在二叉樹:構(gòu)造二叉樹登場(chǎng)!,已經(jīng)講過,只有 中序與后序 和 中序和前序 可以確定一顆唯一的二叉樹。前序和后序是不能確定唯一的
    的頭像 發(fā)表于 07-14 11:20 ?1382次閱讀

    使用C語言代碼實(shí)現(xiàn)平衡二叉樹

    這篇博客主要總結(jié)平衡二叉樹,所以,二叉排序樹知識(shí)不會(huì)提及,但是會(huì)用到。
    的頭像 發(fā)表于 09-21 11:00 ?965次閱讀

    二叉樹的代碼實(shí)現(xiàn)

    二叉樹的主要操作有遍歷,例如有先序遍歷、中序遍歷、后序遍歷。在遍歷之前,就是創(chuàng)建一棵二叉樹,當(dāng)然,還需要有刪除二叉樹的算法。
    的頭像 發(fā)表于 01-18 10:41 ?1118次閱讀
    <b class='flag-5'>二叉樹</b>的代碼實(shí)現(xiàn)

    C++構(gòu)建并復(fù)制二叉樹

    使用C++構(gòu)建一個(gè)二叉樹并復(fù)制、輸出。
    的頭像 發(fā)表于 01-10 15:17 ?903次閱讀
    C++構(gòu)建并復(fù)制<b class='flag-5'>二叉樹</b>

    C++自定義二叉樹并輸出二叉樹圖形

    使用C++構(gòu)建一個(gè)二叉樹并輸出。
    的頭像 發(fā)表于 01-10 16:29 ?1534次閱讀
    C++自定義<b class='flag-5'>二叉樹</b>并輸出<b class='flag-5'>二叉樹</b>圖形

    這么簡(jiǎn)單的二叉樹算法都不會(huì)?

    這個(gè)題目leetcode572題,要求是這樣的:給定兩顆二叉樹A和B,判斷B是否是A的子樹。
    的頭像 發(fā)表于 08-29 11:19 ?707次閱讀
    這么簡(jiǎn)單的<b class='flag-5'>二叉樹</b>算法都不會(huì)?