1. 程式人生 > 實用技巧 >leetcode刷題筆記一百零三題 二叉樹的鋸齒層次遍歷

leetcode刷題筆記一百零三題 二叉樹的鋸齒層次遍歷

leetcode刷題筆記一百零三題 二叉樹的鋸齒層次遍歷

源地址:103. 二叉樹的鋸齒形層次遍歷

問題描述:

給定一個二叉樹,返回其節點值的鋸齒形層次遍歷。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行)。

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

3

/
9 20
/
15 7
返回鋸齒形層次遍歷如下:

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

/**
本題與102題基本一致,可分為迭代與遞迴的方法,基本思路一致,需要設定一個Order變數指示當前插入方向
迭代方法:可以使用雙端對列,這裡我使用的還是queue,只是根據當order_left為false時,插入floorRes.reverse
遞迴方法:DFS思想基本一致,就是根據order值和level%2的值,選擇插入floorRes頭部還是尾部
*/
/**
 * 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.collection.mutable
import util.control.Breaks._
object Solution {
    def zigzagLevelOrder(root: TreeNode): List[List[Int]] = {
        val queue = new mutable.Queue[TreeNode]()
        var orderLeft = true
        val res = new mutable.ListBuffer[List[Int]]()
        if (root == null) return List()
        queue.enqueue(root)

        while (queue.isEmpty == false){
            val queueSize = queue.size
            val floorRes = new mutable.ListBuffer[Int]()
            for(i <- 0 until queueSize){
                breakable{
                    val tempNode = queue.dequeue
                    if (tempNode == null) break()
                    floorRes += tempNode.value
                    queue.enqueue(tempNode.left)
                    queue.enqueue(tempNode.right)
                }
            }
            if (orderLeft == true){
                if(floorRes.size > 0) res += floorRes.toList
                orderLeft = false   
            }
            else{
                if(floorRes.size > 0) res += floorRes.reverse.toList
                orderLeft = true
            }
        }

        return res.toList
    }
}