国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何才能夠翻轉二叉樹

新材料在線 ? 來源:代碼隨想錄 ? 作者:程序員Carl ? 2021-09-01 11:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

這道題目是非常經(jīng)典的題目,也是比較簡單的題目(至少一看就會)。

但正是因為這道題太簡單,一看就會,一些同學都沒有抓住起本質,稀里糊涂的就把這道題目過了。

如果做過這道題的同學也建議認真看完,相信一定有所收獲!

226.翻轉二叉樹題目地址:https://leetcode-cn.com/problems/invert-binary-tree/

翻轉一棵二叉樹。

這道題目背后有一個讓程序員心酸的故事,聽說 Homebrew的作者Max Howell,就是因為沒在白板上寫出翻轉二叉樹,最后被Google拒絕了。(真假不做判斷,權當一個樂子哈)

思路我們之前介紹的都是各種方式遍歷二叉樹,這次要翻轉了,感覺還是有點懵逼。

這得怎么翻轉呢?

如果要從整個樹來看,翻轉還真的挺復雜,整個樹以中間分割線進行翻轉,如圖:

可以發(fā)現(xiàn)想要翻轉它,其實就把每一個節(jié)點的左右孩子交換一下就可以了。

關鍵在于遍歷順序,前中后序應該選哪一種遍歷順序?(一些同學這道題都過了,但是不知道自己用的是什么順序)

遍歷的過程中去翻轉每一個節(jié)點的左右孩子就可以達到整體翻轉的效果。

注意只要把每一個節(jié)點的左右孩子翻轉一下,就可以達到整體翻轉的效果

這道題目使用前序遍歷和后序遍歷都可以,唯獨中序遍歷不行,因為中序遍歷會把某些節(jié)點的左右孩子翻轉了兩次!建議拿紙畫一畫,就理解了

那么層序遍歷可以不可以呢?依然可以的!只要把每一個節(jié)點的左右孩子翻轉一下的遍歷方式都是可以的!

遞歸法對于二叉樹的遞歸法的前中后序遍歷,已經(jīng)在二叉樹:前中后序遞歸遍歷詳細講解了。

我們下文以前序遍歷為例,通過動畫來看一下翻轉的過程:

我們來看一下遞歸三部曲:

確定遞歸函數(shù)的參數(shù)和返回值

參數(shù)就是要傳入節(jié)點的指針,不需要其他參數(shù)了,通常此時定下來主要參數(shù),如果在寫遞歸的邏輯中發(fā)現(xiàn)還需要其他參數(shù)的時候,隨時補充。

返回值的話其實也不需要,但是題目中給出的要返回root節(jié)點的指針,可以直接使用題目定義好的函數(shù),所以就函數(shù)的返回類型為TreeNode*。

TreeNode* invertTree(TreeNode* root)

確定終止條件

當前節(jié)點為空的時候,就返回

if (root == NULL) return root;

確定單層遞歸的邏輯

因為是先前序遍歷,所以先進行交換左右孩子節(jié)點,然后反轉左子樹,反轉右子樹。

swap(root-》left, root-》right);

invertTree(root-》left);

invertTree(root-》right);

基于這遞歸三步法,代碼基本寫完,C++代碼如下:

class Solution {public:

TreeNode* invertTree(TreeNode* root) {

if (root == NULL) return root;

swap(root-》left, root-》right); // 中

invertTree(root-》left); // 左

invertTree(root-》right); // 右

return root;

}

};

迭代法深度優(yōu)先遍歷二叉樹:聽說遞歸能做的,棧也能做!中給出了前中后序迭代方式的寫法,所以本地可以很輕松的切出如下迭代法的代碼:

C++代碼迭代法(前序遍歷)

class Solution {public:

TreeNode* invertTree(TreeNode* root) {

if (root == NULL) return root;

stack《TreeNode*》 st;

st.push(root);

while(!st.empty()) {

TreeNode* node = st.top(); // 中

st.pop();

swap(node-》left, node-》right);

if(node-》right) st.push(node-》right); // 右

if(node-》left) st.push(node-》left); // 左

}

return root;

}

};

如果這個代碼看不懂的話可以在回顧一下二叉樹:聽說遞歸能做的,棧也能做!。

我們在二叉樹:前中后序迭代方式的統(tǒng)一寫法中介紹了統(tǒng)一的寫法,所以,本題也只需將文中的代碼少做修改便可。

C++代碼如下迭代法(前序遍歷)

class Solution {public:

TreeNode* invertTree(TreeNode* root) {

stack《TreeNode*》 st;

if (root != NULL) st.push(root);

while (!st.empty()) {

TreeNode* node = st.top();

if (node != NULL) {

st.pop();

if (node-》right) st.push(node-》right); // 右

if (node-》left) st.push(node-》left); // 左

st.push(node); // 中

st.push(NULL);

} else {

st.pop();

node = st.top();

st.pop();

swap(node-》left, node-》right); // 節(jié)點處理邏輯

}

}

return root;

}

};

如果上面這個代碼看不懂,回顧一下文章二叉樹:前中后序迭代方式的統(tǒng)一寫法。

廣度優(yōu)先遍歷也就是層序遍歷,層數(shù)遍歷也是可以翻轉這棵樹的,因為層序遍歷也可以把每個節(jié)點的左右孩子都翻轉一遍,代碼如下:

class Solution {public:

TreeNode* invertTree(TreeNode* root) {

queue《TreeNode*》 que;

if (root != NULL) que.push(root);

while (!que.empty()) {

int size = que.size();

for (int i = 0; i 《 size; i++) {

TreeNode* node = que.front();

que.pop();

swap(node-》left, node-》right); // 節(jié)點處理

if (node-》left) que.push(node-》left);

if (node-》right) que.push(node-》right);

}

}

return root;

}

};

如果對以上代碼不理解,或者不清楚二叉樹的層序遍歷,可以看這篇二叉樹:層序遍歷登場!

總結針對二叉樹的問題,解題之前一定要想清楚究竟是前中后序遍歷,還是層序遍歷。

二叉樹解題的大忌就是自己稀里糊涂的過了(因為這道題相對簡單),但是也不知道自己是怎么遍歷的。

這也是造成了二叉樹的題目“一看就會,一寫就廢”的原因。

針對翻轉二叉樹,我給出了一種遞歸,三種迭代(兩種模擬深度優(yōu)先遍歷,一種層序遍歷)的寫法,都是之前我們講過的寫法,融匯貫通一下而已。

大家一定也有自己的解法,但一定要成方法論,這樣才能通用,才能舉一反三!

其他語言版本Java://DFS遞歸class Solution {

/**

* 前后序遍歷都可以

* 中序不行,因為先左孩子交換孩子,再根交換孩子(做完后,右孩子已經(jīng)變成了原來的左孩子),再右孩子交換孩子(此時其實是對原來的左孩子做交換)

*/

public TreeNode invertTree(TreeNode root) {

if (root == null) {

return null;

}

invertTree(root.left);

invertTree(root.right);

swapChildren(root);

return root;

}

private void swapChildren(TreeNode root) {

TreeNode tmp = root.left;

root.left = root.right;

root.right = tmp;

}

}

//BFSclass Solution {

public TreeNode invertTree(TreeNode root) {

if (root == null) {return null;}

ArrayDeque《TreeNode》 deque = new ArrayDeque《》();

deque.offer(root);

while (!deque.isEmpty()) {

int size = deque.size();

while (size-- 》 0) {

TreeNode node = deque.poll();

swap(node);

if (node.left != null) {deque.offer(node.left);}

if (node.right != null) {deque.offer(node.right);}

}

}

return root;

}

public void swap(TreeNode root) {

TreeNode temp = root.left;

root.left = root.right;

root.right = temp;

}

}

Python遞歸法:前序遍歷:

class Solution:

def invertTree(self, root: TreeNode) -》 TreeNode:

if not root:

return None

root.left, root.right = root.right, root.left #中

self.invertTree(root.left) #左

self.invertTree(root.right) #右

return root

迭代法:深度優(yōu)先遍歷(前序遍歷):

class Solution:

def invertTree(self, root: TreeNode) -》 TreeNode:

if not root:

return root

st = []

st.append(root)

while st:

node = st.pop()

node.left, node.right = node.right, node.left #中

if node.right:

st.append(node.right) #右

if node.left:

st.append(node.left) #左

return root

迭代法:廣度優(yōu)先遍歷(層序遍歷):

import collections

class Solution:

def invertTree(self, root: TreeNode) -》 TreeNode:

queue = collections.deque() #使用deque()

if root:

queue.append(root)

while queue:

size = len(queue)

for i in range(size):

node = queue.popleft()

node.left, node.right = node.right, node.left #節(jié)點處理

if node.left:

queue.append(node.left)

if node.right:

queue.append(node.right)

return root

責任編輯:haq

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

    關注

    22

    文章

    2123

    瀏覽量

    77110
  • 代碼
    +關注

    關注

    30

    文章

    4967

    瀏覽量

    73954
  • 二叉樹
    +關注

    關注

    0

    文章

    74

    瀏覽量

    12924

原文標題:你真的會翻轉二叉樹么?

文章出處:【微信號:xincailiaozaixian,微信公眾號:新材料在線】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    入門宇機器人開發(fā):從SDK源碼探索到實戰(zhàn)操作

    機器人(Unitree)作為全球領先的四足機器人研發(fā)企業(yè),其推出的unitree_sdk2是面向旗下 Go2、H1、B2 等系列機器人的第代軟件開發(fā)工具包。該 SDK 提供了豐富的接口和示例代碼,支持開發(fā)者快速實現(xiàn)機器人控制、狀態(tài)獲取、傳感器數(shù)據(jù)處理等功能,是入門宇
    的頭像 發(fā)表于 02-06 16:43 ?2763次閱讀
    入門宇<b class='flag-5'>樹</b>機器人開發(fā):從SDK源碼探索到實戰(zhàn)操作

    TüV萊茵與杭集團達成戰(zhàn)略合作并頒發(fā)歐盟CE-MD符合性證書

    日前,國際獨立第三方檢測、檢驗和認證機構德國萊茵TüV大中華區(qū)(簡稱"TüV萊茵")與杭集團股份有限公司(簡稱"杭集團")簽署了戰(zhàn)略合作協(xié)議,標志著雙方
    的頭像 發(fā)表于 01-15 12:18 ?268次閱讀

    無線傾角傳感器在古監(jiān)測中的應用:以科技守護活文物的結構安全

    無線傾角傳感器在古監(jiān)測中的應用:以科技守護活文物的結構安全
    的頭像 發(fā)表于 01-09 11:38 ?650次閱讀
    無線傾角傳感器在古<b class='flag-5'>樹</b>監(jiān)測中的應用:以科技守護活文物的結構安全

    億緯鋰能與杭集團達成戰(zhàn)略合作

    近日,億緯鋰能與杭集團2025年戰(zhàn)略研討會暨戰(zhàn)略合作協(xié)議簽約儀式在杭州舉行。億緯鋰能副總裁、商用車電池產(chǎn)品線總裁江吉兵博士,億緯鋰能商用車電池產(chǎn)品線國內銷售部總經(jīng)理井振江,杭集團董事、副總經(jīng)理兼
    的頭像 發(fā)表于 01-04 18:18 ?1079次閱讀

    【OK3506-S12Mini試用評測()】開發(fā)板SDK配置動態(tài)設備

    在配好的虛擬機的終端輸入./build.sh bconfig,選擇Kernal 進去之后選擇圖中選項(按Y確定) Defconfig name 需要在終端輸入命令,才能得到需要寫的名字。 動態(tài)設備的名字是在虛擬機中找到要用的的dts文件。
    發(fā)表于 11-19 17:09

    通過優(yōu)化代碼來提高MCU運行效率

    選擇時間復雜度低的算法。 根據(jù)訪問模式選擇數(shù)據(jù)結構。頻繁查找用哈希表,有序數(shù)據(jù)用二叉樹等。 查表法:對于復雜的數(shù)學計算(如sin, log),或者協(xié)議解析,預先計算好結果存于數(shù)組中,用空間換時間
    發(fā)表于 11-12 08:21

    蜂鳥E203內核中斷管理模塊sirv_plic_man代碼分析

    。 上面的代碼生成一個二叉樹結構來比較和選擇具有最大優(yōu)先級的掛起中斷源及其ID。樹狀結構由級聯(lián)比較器組成,每一層的比較器數(shù)量是前一層的一半。在的每一層,選擇優(yōu)先級最高的中斷并傳遞到下一層,直到只剩下
    發(fā)表于 10-23 06:05

    請問rtt studio 的文件夾打紅什么意思?

    rtt studio 的文件夾打紅什么意思?而且文件夾里面實際是有文件的,但是瀏覽不出來。
    發(fā)表于 09-18 06:34

    機器人看點:宇新專利可提升機器人表演效果 蔚來資本入股具身智能公司原力靈機 美信科技新設機器人制

    。宇科技的新專利通過構建環(huán)境采集模塊、地圖處理模塊、數(shù)字舞臺孿生模塊、舞蹈動作設計模塊、軌跡規(guī)劃模塊、舞蹈合成模塊,進行數(shù)據(jù)交互和功能協(xié)同,能夠確保機器人能夠準確感知和適應舞臺環(huán)境的變化,使得機器人動作
    的頭像 發(fā)表于 09-01 16:55 ?1982次閱讀

    科技,被起訴

    電子發(fā)燒友網(wǎng)綜合報道 天眼查顯示,近日,杭州宇科技股份有限公司(以下簡稱“宇科技”)新增1條開庭公告,原告為杭州露韋美日化有限公司(以下簡稱“露韋美日化”),案由為侵害發(fā)明專利權糾紛,該案將于8
    的頭像 發(fā)表于 08-26 07:50 ?4918次閱讀
    宇<b class='flag-5'>樹</b>科技,被起訴

    在使用EZ-USB? FX3? 設備時,上電后相機開始正常工作,但延時10s左右播放器才能夠顯示圖像數(shù)據(jù)?為什么?

    在使用EZ-USB? FX3? 設備時,上電后相機開始正常工作,但延時10s左右播放器才能夠顯示圖像數(shù)據(jù)?這是由于固件中的某些設置問題嗎?
    發(fā)表于 07-16 07:08

    億緯鋰能榮獲杭集團2022-2024年度優(yōu)秀供應商獎

    近日,億緯鋰能憑借卓越產(chǎn)品、可靠交付與優(yōu)質服務榮獲杭集團頒發(fā)的“2022-2024年度優(yōu)秀供應商”獎。杭集團副總經(jīng)理兼杭電器董事長金華曙、杭電器總經(jīng)理兼杭博電機總經(jīng)理李明輝出席
    的頭像 發(fā)表于 07-15 09:00 ?979次閱讀

    下一代高速芯片晶體管解制造問題解決了!

    晶體管的密度,同時減少了芯片的橫向面積。 相比傳統(tǒng)的FinFET和納米片晶體管,片晶體管能夠顯著減少nFET和pFET之間的間距,從而在相同的芯片面積上容納更多的晶體管。例如,IMEC的2nm片晶
    發(fā)表于 06-20 10:40

    請問K230 V3.0版本燒錄固件和使用IDE到底是燒錄哪個啊?

    使用了官網(wǎng)給的兩個鏡像包 如圖 燒錄進去后,都沒有顯示CAN MV 只顯示了如下圖這個 打開IDE一直使用鏈接不到 期待結果和實際結果 燒錄哪一個鏡像包的才能夠準確使用? 并且能夠使用CAN MV IDE 進行開發(fā)
    發(fā)表于 04-29 07:27

    白話理解RCC時鐘(可下載)

    時鐘就像是單片機的“心臟”,單片機正常工作離不開時鐘的支持,下圖是我們單片機的時鐘 ,它反映了單片機的時鐘關系。我們來詳細描述一下時鐘的工作原理。寄存器上電后有一個復位值,大家看我畫紅線的這個
    發(fā)表于 03-27 13:50 ?0次下載