LeetCode進(jìn)階226-翻轉(zhuǎn)二叉樹(華為面試題)

概要

本篇介紹一下關(guān)于二叉樹結(jié)構(gòu)很基礎(chǔ)的面試題裙秋,基礎(chǔ)到什么程度呢匹表,引用谷歌的話術(shù): 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so f*** off.(連二叉樹翻轉(zhuǎn)你都不會,你還玩?zhèn)€毛C又怠)進(jìn)一步說明了學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法的重要性——為了不被谷歌鄙視-.-

華為面試題——將二叉樹的兩個(gè)孩子換位置,即左變右,右變左扛拨。不能用遞規(guī)。

原題

226. Invert Binary Tree(Easy)

Invert a binary tree.

Example:

Input:

image

Output:

image

Trivia:
This problem was inspired by this original tweet by Max Howell:

Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so f*** off.

226. 翻轉(zhuǎn)二叉樹 (簡單)

翻轉(zhuǎn)一棵二叉樹举塔。

示例:

輸入:

image

輸出:

image

備注:
這個(gè)問題是受到 Max Howell 的原問題啟發(fā):

谷歌:
我們谷歌90%的工程師使用你寫的軟件(Homebrew)绑警,但是你卻無法在面試時(shí)在白板上寫出翻轉(zhuǎn)二叉樹這道題,這...(連二叉樹翻轉(zhuǎn)你都不會央渣,你還玩?zhèn)€毛<坪小)
  • 分類:樹(tree)

分析

理解遞歸思想的條件下很容易想到解題思路,當(dāng)然可能有人會有疑問芽丹,那什么情況下知道使用遞歸呢北启,有個(gè)最簡單的辦法如果算法里需要重復(fù)循環(huán)用同一個(gè)思路執(zhí)行得到結(jié)果,那么必然可以使用遞歸。進(jìn)行翻轉(zhuǎn)本質(zhì)上可以拆分為兩步遞歸咕村,遞歸翻轉(zhuǎn)左子樹和遞歸翻轉(zhuǎn)右子樹分场钉。無論是否使用遞歸本質(zhì)思想是一致的,使用非遞歸的方式則需要借助使用椥柑危或者隊(duì)列的結(jié)構(gòu)進(jìn)行存儲未交換的子節(jié)點(diǎn)惹悄。

思路設(shè)計(jì)

方法一:循環(huán),棧存儲(DFS肩钠,非遞歸)

本質(zhì)思想是棕兼,左右節(jié)點(diǎn)進(jìn)行交換谒臼,循環(huán)翻轉(zhuǎn)每個(gè)節(jié)點(diǎn)的左右子節(jié)點(diǎn),將未翻轉(zhuǎn)的子節(jié)點(diǎn)存入棧中嘀略,循環(huán)直到棧里所有節(jié)點(diǎn)都循環(huán)交換完為止呛每。方法一偽代碼:

方法二:循環(huán)踩窖,隊(duì)列存儲(BFS,非遞歸)

本質(zhì)思想是晨横,左右節(jié)點(diǎn)進(jìn)行交換洋腮,循環(huán)翻轉(zhuǎn)每個(gè)節(jié)點(diǎn)的左右子節(jié)點(diǎn),將未翻轉(zhuǎn)的子節(jié)點(diǎn)存入隊(duì)列中手形,循環(huán)直到棧里所有節(jié)點(diǎn)都循環(huán)交換完為止啥供。

  • 方法一、方法二偽代碼:
1库糠、判斷根結(jié)點(diǎn)是否為空伙狐,為空則返回null;
2瞬欧、新建棧(隊(duì)列)贷屎,用于節(jié)點(diǎn)存儲,初始存入根節(jié)點(diǎn)到棧(隊(duì)列)里艘虎;
3唉侄、while循環(huán),棧(隊(duì)列)為空時(shí)結(jié)束循環(huán)野建;
  i.出棧(隊(duì)列)一個(gè)節(jié)點(diǎn)属划,將該節(jié)點(diǎn)的左右子節(jié)點(diǎn)交互;
  ii.判斷左右子節(jié)點(diǎn)是否為null贬墩,非null則繼續(xù)將左右節(jié)點(diǎn)入棧(隊(duì)列)榴嗅;
4、循環(huán)交換結(jié)束陶舞,返回根節(jié)點(diǎn);

方法三:遞歸

本質(zhì)思想也是左右節(jié)點(diǎn)進(jìn)行交換嗽测,交換前遞歸調(diào)用對根結(jié)點(diǎn)的左右節(jié)點(diǎn)分別進(jìn)行處理,保證交換前左右節(jié)點(diǎn)已經(jīng)翻轉(zhuǎn)。

  • 方法三偽代碼:
1唠粥、判斷根結(jié)點(diǎn)是否為空疏魏,為空則返回null;
2晤愧、交換跟節(jié)點(diǎn)的左右節(jié)點(diǎn)大莫;
3、遞歸交互左右子樹官份;

編碼實(shí)踐

棧實(shí)現(xiàn)

       public TreeNode invertTree(TreeNode root) {          
            if (root == null) {
                return null;
            }
            Stack<TreeNode> stack = new Stack<>();
            stack.push(root);           
            while(!stack.isEmpty()) {
                final TreeNode node = stack.pop();
                final TreeNode left = node.left;
                node.left = node.right;
                node.right = left;           
                if(node.left != null) {
                    stack.push(node.left);
                }
                if(node.right != null) {
                    stack.push(node.right);
                }
            }
            return root;
        }
image

隊(duì)列實(shí)現(xiàn)

    public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            TreeNode left = node.left;
            node.left = node.right;
            node.right = left;
            if (node.left != null) {
                queue.offer(node.left);
            }
            if (node.right != null) {
                queue.offer(node.right);
            }
        }
        return root;
    }
image

遞歸實(shí)現(xiàn)

    public TreeNode invertTree(TreeNode node) {
        if (node == null) {
            return null;
        }
        TreeNode temp = node.left;
        node.left = node.right;
        node.right = temp;
        invertTree(node.left);
        invertTree(node.right);
        return node;
    }
image

彩蛋

對比三種實(shí)現(xiàn)代碼執(zhí)行結(jié)果會發(fā)現(xiàn)只厘,三種方法最終leetcode測評的效率都是100%,但是方法一的runtime時(shí)間確實(shí)1ms舅巷,而方法二和方法三的runtime卻是0ms羔味。為什么同樣的算法思想使用不同的數(shù)據(jù)結(jié)構(gòu),使用Stack比使用LinkedList要慢呢钠右?這便是本篇的彩蛋赋元!

結(jié)語

華為面試題中的二叉樹翻轉(zhuǎn)使用非遞歸實(shí)現(xiàn)是一道基礎(chǔ)知識題,二叉樹的左右子節(jié)點(diǎn)翻轉(zhuǎn)的非遞歸實(shí)現(xiàn)也包含了DFS和BFS的使用飒房,最后如果覺得本篇對你有所幫助搁凸,給個(gè)贊吧0.0~

關(guān)注訂閱號 獲取更多干貨~
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市狠毯,隨后出現(xiàn)的幾起案子护糖,更是在濱河造成了極大的恐慌,老刑警劉巖垃你,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椅文,死亡現(xiàn)場離奇詭異,居然都是意外死亡惜颇,警方通過查閱死者的電腦和手機(jī)皆刺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凌摄,“玉大人羡蛾,你說我怎么就攤上這事∠强鳎” “怎么了痴怨?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長器予。 經(jīng)常有香客問我浪藻,道長,這世上最難降的妖魔是什么乾翔? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任爱葵,我火速辦了婚禮施戴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘萌丈。我一直安慰自己赞哗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布辆雾。 她就那樣靜靜地躺著肪笋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪度迂。 梳的紋絲不亂的頭發(fā)上藤乙,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機(jī)與錄音惭墓,去河邊找鬼湾盒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛诅妹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播毅人,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼吭狡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丈莺?” 一聲冷哼從身側(cè)響起划煮,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缔俄,沒想到半個(gè)月后弛秋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俐载,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年蟹略,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遏佣。...
    茶點(diǎn)故事閱讀 40,912評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挖炬,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出状婶,到底是詐尸還是另有隱情意敛,我是刑警寧澤,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布膛虫,位于F島的核電站草姻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏稍刀。R本人自食惡果不足惜撩独,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跌榔,春花似錦异雁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至担平,卻和暖如春示绊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背暂论。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工面褐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人取胎。 一個(gè)月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓展哭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親闻蛀。 傳聞我的和親對象是個(gè)殘疾皇子匪傍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評論 2 361