103. 二叉樹的鋸齒形層序遍歷(每日一題)

lzyprime 博客 (github)
創(chuàng)建時間:2020.12.22
qq及郵箱:2383518170

leetcode 筆記


題目描述:

給定一個二叉樹选脊,返回其節(jié)點值的鋸齒形層序遍歷刻坊。(即先從左往右,再從右往左進行下一層遍歷权逗,以此類推,層與層之間交替進行)启盛。

例如:
給定二叉樹 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回鋸齒形層序遍歷如下:

[
  [3],
  [20,9],
  [15,7]
]

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有姊氓。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處蟀伸。

code

二叉樹的層次遍歷蚀同。

至于從前往后還是從后往前讀,無非是個下標(biāo)的問題啊掏。開一個和當(dāng)前層等長的數(shù)組蠢络,如果從后往前讀則下標(biāo)倒序,把當(dāng)前層的val插入到數(shù)組里迟蜜。

  • c++

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        if(root == nullptr) return {};

        vector<vector<int>> ans;

        queue<TreeNode *> q;
        q.push(root);
        bool reverse = false;
        while(!q.empty()) {
            int len = q.size();
            vector<int> tmp(len, 0);
            for(int i = 0; i < len; i++) {
                root = q.front();
                q.pop();
                tmp[reverse ? len - i - 1 : i] = root -> val;
                if(root -> left != nullptr) q.push(root -> left);
                if(root -> right != nullptr) q.push(root -> right);
            }
            ans.push_back(move(tmp));
            reverse = !reverse;
        }
        return ans;
    }
};

函數(shù)式語言里, 利用flatMap可以很容易的拿到下一層節(jié)點組成的集合, map得到當(dāng)前層節(jié)點val的集合刹孔。

  • kotlin

尾遞歸函數(shù) tailrec fun zigzagLevelOrder:

ans: List<List<Int>> : 當(dāng)前的累計結(jié)果

list: List<TreeNode> : 當(dāng)前層節(jié)點。

reverse: Boolean : 是否要倒序

如果當(dāng)前層沒有節(jié)點, 說明到底了, 返回ans; 否則娜睛, ans + 當(dāng)前層節(jié)點val的集合 作為新的累計結(jié)果髓霞, list.flatMap{ it -> listOfNotNull(it.left, it.right) } 得到下一層非空節(jié)點的集合卦睹, 開始調(diào)用下一層

所以可以一行, 一刀流方库。

tailrec fun zigzagLevelOrder(ans: List<List<Int>>, list: List<TreeNode>, reverse: Boolean): List<List<Int>> = if (list.isEmpty()) ans else zigzagLevelOrder(ans + listOf(list.map { it.`val` }.let { if (reverse) it.asReversed() else it }), list.flatMap { listOfNotNull(it.left, it.right) }, !reverse)
class Solution {
    fun zigzagLevelOrder(root: TreeNode?): List<List<Int>> {
        root ?: return emptyList()

        tailrec fun zigzagLevelOrder(ans: List<List<Int>>, list: List<TreeNode>, reverse: Boolean): List<List<Int>> =
            if (list.isEmpty()) ans
            else
                zigzagLevelOrder(
                    ans + listOf(list.map { it.`val` }.let { if (reverse) it.asReversed() else it }),
                    list.flatMap { listOfNotNull(it.left, it.right) },
                    !reverse
                )


        return zigzagLevelOrder(emptyList(), listOf(root), false)
    }
}
  • scala

一刀流

@tailrec
def zigzagLevelOrder(ans: List[List[Int]], list: List[TreeNode], reverse: Boolean): List[List[Int]] = if (list.isEmpty) ans else zigzagLevelOrder(ans ::: List(if (reverse) list.map(_.value).reverse else list.map(_.value)) ::: Nil, list flatMap (it => it.left :: it.right :: Nil) filter (_ != null), !reverse)

/**
 * Definition for a binary tree node.
 * class TreeNode(var _value: Int) {
 *   var value: Int = _value
 *   var left: TreeNode = null
 *   var right: TreeNode = null
 * }
 */

import scala.annotation.tailrec

object Solution {

  def zigzagLevelOrder(root: TreeNode): List[List[Int]] = {
    if (root == null) return Nil

    @tailrec
    def zigzagLevelOrder(ans: List[List[Int]], list: List[TreeNode], reverse: Boolean): List[List[Int]] =
      if (list.isEmpty) ans
      else
        zigzagLevelOrder(
          ans ::: List(if (reverse) list.map(_.value).reverse else list.map(_.value)) ::: Nil,
          list flatMap (it => it.left :: it.right :: Nil) filter (_ != null),
          !reverse
        )


    zigzagLevelOrder(Nil, List(root), reverse = false)
  }
}

  • rust

這種數(shù)據(jù)結(jié)構(gòu)題用 Rust 很不地道结序。尤其是一刀流,會比普通寫法還長纵潦,函數(shù)棧的原因要多耗點內(nèi)存徐鹤。算法復(fù)雜度相同的話,兩種寫法耗時不會有差距

// 一刀流 花括號不能省邀层,導(dǎo)致很長
impl Solution {
    pub fn zigzag_level_order(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<Vec<i32>> {
        if let Some(i) = root {
            fn zigzag_level_order(
                mut ans: Vec<Vec<i32>>,
                cur: Vec<Rc<RefCell<TreeNode>>>,
                reverse: bool,
            ) -> Vec<Vec<i32>> {
                if cur.is_empty() {
                    ans
                } else {
                    zigzag_level_order(
                        {
                            let tmp = cur.iter().map(|i| i.borrow().val);
                            ans.push(if reverse {
                                tmp.rev().collect()
                            } else {
                                tmp.collect()
                            });
                            ans
                        },
                        cur.iter().fold(vec![], |mut acc, i| {
                            if let Some(ref left) = i.borrow().left {
                                acc.push(left.clone())
                            }
                            if let Some(ref right) = i.borrow().right {
                                acc.push(right.clone())
                            }
                            acc
                        }),
                        !reverse,
                    )
                }
            }
            zigzag_level_order(vec![], vec![i], false)
        } else {
            vec![]
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末返敬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子寥院,更是在濱河造成了極大的恐慌劲赠,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件只磷,死亡現(xiàn)場離奇詭異经磅,居然都是意外死亡,警方通過查閱死者的電腦和手機钮追,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門预厌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人元媚,你說我怎么就攤上這事轧叽。” “怎么了刊棕?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵炭晒,是天一觀的道長。 經(jīng)常有香客問我甥角,道長网严,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任嗤无,我火速辦了婚禮震束,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘当犯。我一直安慰自己垢村,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布嚎卫。 她就那樣靜靜地躺著嘉栓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侵佃,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天麻昼,我揣著相機與錄音,去河邊找鬼趣钱。 笑死涌献,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的首有。 我是一名探鬼主播燕垃,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼井联!你這毒婦竟也來了卜壕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤烙常,失蹤者是張志新(化名)和其女友劉穎轴捎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚕脏,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡侦副,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了驼鞭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秦驯。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖挣棕,靈堂內(nèi)的尸體忽然破棺而出译隘,到底是詐尸還是另有隱情,我是刑警寧澤洛心,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布固耘,位于F島的核電站,受9級特大地震影響词身,放射性物質(zhì)發(fā)生泄漏厅目。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一法严、第九天 我趴在偏房一處隱蔽的房頂上張望璧瞬。 院中可真熱鬧,春花似錦渐夸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春苫幢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工街夭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留祸轮,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓哀峻,卻偏偏與公主長得像涡相,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子剩蟀,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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