71.二叉樹(shù)的鋸齒形層次遍歷

描述

給出一棵二叉樹(shù),返回其節(jié)點(diǎn)值的鋸齒形層次遍歷(先從左往右,下一層再?gòu)挠彝螅瑢优c層之間交替進(jìn)行)

樣例

給出一棵二叉樹(shù) {3,9,20,#,#,15,7}

        3
       / \
      9  20
         /  \
        15   7

返回其鋸齒形的層次遍歷為:

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

代碼

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */


public class Solution {
    /*
     * @param root: A Tree
     * @return: A list of lists of integer include the zigzag level order traversal of its nodes' values.
     */
    public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<>();

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

        Stack<TreeNode> currLevel = new Stack<TreeNode>();
        Stack<TreeNode> nextLevel = new Stack<TreeNode>();
        // 不需要新建棧
        Stack<TreeNode> tmp;
        
        currLevel.push(root);
        // normal代表當(dāng)前層順序是不是從左往右
        boolean normalOrder = true;
        // 因?yàn)閏urLevel和nextLevel不斷來(lái)回交換,第一個(gè)while用于判斷樹(shù)是否遍歷完最后一層
        while (!currLevel.isEmpty()) {
            // 每一層都要新建一個(gè)動(dòng)態(tài)數(shù)組存儲(chǔ)當(dāng)前層的值
            ArrayList<Integer> currLevelResult = new ArrayList<Integer>();
            
            // 第二個(gè)while用于判斷當(dāng)前層結(jié)點(diǎn)是否遍歷完成
            while (!currLevel.isEmpty()) {
                TreeNode node = currLevel.pop();
                currLevelResult.add(node.val);
                
                // 棧的彈出是反的,當(dāng)前層正常順序,下一層先壓左后壓右,先彈右后彈左
                if (normalOrder) {
                    if (node.left != null) {
                        nextLevel.push(node.left);
                    }
                    if (node.right != null) {
                        nextLevel.push(node.right);
                    }
                } else {
                    if (node.right != null) {
                        nextLevel.push(node.right);
                    }
                    if (node.left != null) {
                        nextLevel.push(node.left);
                    }
                }
            }

            result.add(currLevelResult);
            // 交換兩個(gè)棧的引用指向,當(dāng)前棧要pop成空棧,子結(jié)點(diǎn)加入到nextLevel
            tmp = currLevel;
            currLevel = nextLevel;
            nextLevel = tmp;
            normalOrder = !normalOrder;
        }

        return result;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 樹(shù)的概述 樹(shù)是一種非常常用的數(shù)據(jù)結(jié)構(gòu),樹(shù)與前面介紹的線性表,棧,隊(duì)列等線性結(jié)構(gòu)不同,樹(shù)是一種非線性結(jié)構(gòu) 1.樹(shù)的定...
    Jack921閱讀 4,489評(píng)論 1 31
  • 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。 難度:中等 要求: 給出一棵二叉樹(shù),返回其節(jié)點(diǎn)值的鋸齒形層次...
    柒黍閱讀 300評(píng)論 0 0
  • 平時(shí)寫代碼沒(méi)有時(shí)間限制,一筆試就各種手忙腳亂,昨天去哪兒筆試的時(shí)候也這樣,寫得亂七八糟的,二叉樹(shù)遍歷都能整出各種幺...
    假裝會(huì)編程閱讀 5,062評(píng)論 0 0
  • 都說(shuō)前五百年的回眸才換來(lái)今生的相遇,你我的相遇是不是那五百年前的回眸才換來(lái)的相遇?愛(ài)一個(gè)人容易,忘掉一個(gè)人很難?很...
    愛(ài)恨的潮汐閱讀 905評(píng)論 0 1