LeetCode 199. 二叉樹的右視圖

199. 二叉樹的右視圖


題目來源:https://leetcode-cn.com/problems/binary-tree-right-side-view/

題目


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

示例:

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

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

解題思路


思路一:廣度優化搜索

當對二叉樹進行層次遍歷時,每一層最右邊的節點是最後訪問的。題目中要求返回從右側所能看到的節點值,正是這裏每層最右邊的節點。那麼保留每層最後的訪問節點,就能得到需要求的答案。

這裏使用隊列存儲。

具體可參照代碼進行理解。

思路二:深度優化搜索

同樣的,這道題也能夠使用深度優化搜索來解決。

在搜索的過程中,我們先訪問右子樹,再訪問左子樹。那麼每層的第一個節點就是最右邊節點。這個時候,只要知道二叉樹的深度,則可以得到最終的答案。

具體可參照代碼進行理解。

代碼實現


代碼實現 | 廣度優化搜索
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def rightSideView(self, root: TreeNode) -> List[int]:
        if root == None:
            return []
        # 導入 deque 創建隊列
        from collections import deque

        queue = deque([root])

        res = []

        while queue:
            size = len(queue)
            # 這裏用 size 記錄二叉樹每層的節點數,
            for i in range(size):
                # 彈出節點
                node = queue.popleft()
                # 先將左節點入隊
                if node.left != None:
                    queue.append(node.left)
                # 再將右節點入隊
                if node.right != None:
                    queue.append(node.right)
                # 隊列先入先出,如果 i 等於 size - 1,
                # 那麼這裏就是最右邊的節點,這個就要得到的結果,將其放入返回列表中
                if i == size - 1:
                    res.append(node.val)

        return res

代碼實現 | 深度優化搜索
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def rightSideView(self, root: TreeNode) -> List[int]:
        res = []

        def _dfs(node, depth):
            if node == None:
                return []

            # res 的索引表示二叉樹的深度
            # 若當前的深度的節點不存在於 res 中,
            # 表示該層的最右邊節點還未將其添加到 res 中
            # 將其加入到節點中
            if depth == len(res):
                res.append(node.val)
            # 往一下層訪問,先訪問右子樹,在訪問左子樹
            depth += 1

            _dfs(node.right, depth)
            _dfs(node.left, depth)

        _dfs(root, 0)

        return res

實現結果


實現結果 | 廣度優化搜索

廣度優化搜索 | 實現結果

實現結果 | 深度優化搜索

深度優化搜索 | 實現結果


以上就是使用廣度優化搜索或深度優化搜索的思想,解決《199. 二叉樹的右視圖》問題的主要內容。


歡迎關注微信公衆號《書所集錄》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章