1. 程式人生 > 實用技巧 >leetcode刷題筆記 一百九十九題 二叉樹的右檢視

leetcode刷題筆記 一百九十九題 二叉樹的右檢視

leetcode刷題筆記 一百九十九題 二叉樹的右檢視

源地址:199. 二叉樹的右檢視

問題描述:

給定一棵二叉樹,想象自己站在它的右側,按照從頂部到底部的順序,返回從右側所能看到的節點值。

示例:

輸入: [1,2,3,null,5,null,4]
輸出: [1, 3, 4]
解釋:

1 <---
/
2 3 <---
\
5 4 <---

//基於DFS的遞迴方法 優先右側
/**
 * Definition for a binary tree node.
 * class TreeNode(_value: Int = 0, _left: TreeNode = null, _right: TreeNode = null) {
 *   var value: Int = _value
 *   var left: TreeNode = _left
 *   var right: TreeNode = _right
 * }
 */
//DFS 遞迴
import scala.collection.mutable
object Solution {
    def rightSideView(root: TreeNode): List[Int] = {
        val res = new mutable.ListBuffer[Int]()
        
        def dfs(root: TreeNode, depth: Int): Unit = {
            if (root == null) return
            if (depth == res.size) res.append(root.value)
            dfs(root.right, depth+1)
            dfs(root.left, depth+1)
        }
        
        dfs(root, 0)
        return res.toList
    }
}

//BFS 逐層遍歷 取每層最後側節點
/**
 * Definition for a binary tree node.
 * class TreeNode(_value: Int = 0, _left: TreeNode = null, _right: TreeNode = null) {
 *   var value: Int = _value
 *   var left: TreeNode = _left
 *   var right: TreeNode = _right
 * }
 */
//BFS
import scala.collection.mutable
object Solution {
    def rightSideView(root: TreeNode): List[Int] = {
        val res = new mutable.ListBuffer[Int]()
        if (root == null) return res.toList
        
        val queue = new mutable.Queue[TreeNode]()
        queue.enqueue(root)
        while (queue.isEmpty == false){
            val size = queue.size
            for(i <- 0 to size-1){
                val node = queue.dequeue
                if (node.left != null) queue.enqueue(node.left)
                if (node.right != null) queue.enqueue(node.right)
                if (i == size-1) res.append(node.value)
            }
        }
        return res.toList
    }
}