513. Find Bottom Left Tree Value

https://leetcode.com/problems/find-bottom-left-tree-value/#/description

Given a binary tree, find the leftmost value in the last row of the tree.

因?yàn)榭戳酥跎?a target="_blank" rel="nofollow">這篇回答覺得應(yīng)該做一下搜索吭从,就看了DFS tag下的這道題朝蜘。

可以先用BFS

這題理解了一下,就是求最后一層的左邊第一個(gè)結(jié)點(diǎn)的value涩金。那么可以用BFS谱醇。BFS我已經(jīng)寫爛了。用動(dòng)態(tài)數(shù)組保存結(jié)果然后讀取最后一個(gè)item的第一個(gè)元素是常規(guī)做法步做,也可以像我這樣用O(1) Space保存當(dāng)前最底層的第一個(gè)結(jié)點(diǎn)副渴。

    public int findBottomLeftValue(TreeNode root) {
        int res = 0;
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        int curNum = 1, nexNum = 0, preNum = 0;
        while (!q.isEmpty()) {
            TreeNode node = q.poll();
            if (curNum == preNum) {
                res = node.val;
            }
            curNum--;

            if (node.left != null) {
                q.add(node.left);
                nexNum++;
            }
            if (node.right != null) {
                q.add(node.right);
                nexNum++;
            }

            if (curNum == 0) {
                preNum = nexNum;
                curNum = nexNum;
                nexNum = 0;
            }
        }
        return res;
    }

DFS

DFS我不熟悉,就先寫了個(gè)保存每層節(jié)點(diǎn)全度,然后取最后一層的第一個(gè)node的value的代碼煮剧,也AC了:

    public int findBottomLeftValue(TreeNode root) {
        int level = 0;
        List<List<TreeNode>> res = new ArrayList<>();
        res = dfs(root, level, res);
        return res.size() > 0 ? res.get(res.size() - 1).get(0).val : -1;
    }

    private List<List<TreeNode>> dfs(TreeNode node, int level, List<List<TreeNode>> res) {
        if (node == null) return null;
        if (level < res.size()) {
            res.get(level).add(node);
        } else {
            List<TreeNode> item = new ArrayList<>();
            item.add(node);
            res.add(item);
        }
        dfs(node.left, level + 1, res);
        dfs(node.right, level + 1, res);
        return res;
    }

然后我優(yōu)化了一下,用O(1)空間了(我發(fā)現(xiàn)用全局變量比較容易思考):

    int maxLvl = -1, res = 0;

    public int findBottomLeftValue(TreeNode root) {
        int level = 0;
        dfs(root, level);
        return res;
    }

    private void dfs(TreeNode node, int level) {
        if (node == null) return;
        if (level > maxLvl) {
            maxLvl = level;
            res = node.val;
        }
        dfs(node.left, level + 1);
        dfs(node.right, level + 1);
    }

另外将鸵,在solutions里看到一種不用global variables的方法

public class Solution {
    public int findBottomLeftValue(TreeNode root) {
        return findBottomLeftValue(root, 1, new int[]{0,0});
    }
    public int findBottomLeftValue(TreeNode root, int depth, int[] res) {
        if (res[1]<depth) {res[0]=root.val;res[1]=depth;}
        if (root.left!=null) findBottomLeftValue(root.left, depth+1, res);
        if (root.right!=null) findBottomLeftValue(root.right, depth+1, res);
        return res[0];
    }
}

我注意到勉盅,那個(gè)地址下面很多人都用了一個(gè)數(shù)組來(lái)保存maxDepth和res;想了很久為什么要這樣做顶掉,直接把這兩個(gè)int值放在參數(shù)里不行嗎草娜?試了一下,確實(shí)不行痒筒,會(huì)返回根節(jié)點(diǎn)的value宰闰。仔細(xì)想了一下,似乎是因?yàn)閞es在遞歸到各個(gè)level的時(shí)候始終是那一塊內(nèi)存地址簿透,就相當(dāng)于global variable了R轶 (我甚至回憶起了大一學(xué)C語(yǔ)言的時(shí)候,余老師在黑板上用方格代表數(shù)組的一連串內(nèi)存地址的場(chǎng)景萎战。。舆逃。哈哈哈哈哈)蚂维,又想到覃超說過的為什么不要?dú)w去來(lái)兮的原因÷肥ǎ恍然大悟了虫啥。

很開心。

另外奄妨,可以注意一下剛才那個(gè)地址里的一個(gè)人說的涂籽,可以這樣寫少遞歸一層:

Add if (null != root.left) and if (null != root.right)before findLeftMostNode(root.left, depth+1);findLeftMostNode(root.right, depth+1);could improve efficiency of recursion.

Always, good luck, Larry!
27 May 2017

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市砸抛,隨后出現(xiàn)的幾起案子评雌,更是在濱河造成了極大的恐慌树枫,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件景东,死亡現(xiàn)場(chǎng)離奇詭異砂轻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)斤吐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門搔涝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人和措,你說我怎么就攤上這事庄呈。” “怎么了派阱?”我有些...
    開封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵诬留,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我颁褂,道長(zhǎng)故响,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任颁独,我火速辦了婚禮彩届,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘誓酒。我一直安慰自己樟蠕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開白布靠柑。 她就那樣靜靜地躺著寨辩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪歼冰。 梳的紋絲不亂的頭發(fā)上靡狞,一...
    開封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音隔嫡,去河邊找鬼甸怕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛腮恩,可吹牛的內(nèi)容都是我干的梢杭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼秸滴,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼武契!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咒唆,失蹤者是張志新(化名)和其女友劉穎届垫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钧排,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡敦腔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恨溜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片符衔。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖糟袁,靈堂內(nèi)的尸體忽然破棺而出判族,到底是詐尸還是另有隱情,我是刑警寧澤项戴,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布形帮,位于F島的核電站,受9級(jí)特大地震影響周叮,放射性物質(zhì)發(fā)生泄漏辩撑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一仿耽、第九天 我趴在偏房一處隱蔽的房頂上張望合冀。 院中可真熱鬧,春花似錦项贺、人聲如沸君躺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)棕叫。三九已至,卻和暖如春奕删,著一層夾襖步出監(jiān)牢的瞬間俺泣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工完残, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砌滞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓坏怪,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親绊茧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铝宵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容