LC 199. 二叉树的右视图
题目描述
这是 LeetCode 上的 199. 二叉树的右视图 ,难度为 中等。
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
1
2
3输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
示例 2:1
2
3输入: [1,null,3]
输出: [1,3]
示例 3:1
2
3输入: []
输出: []
提示:
- 二叉树的节点个数的范围是 $[0,100]$
- $-100 <= Node.val <= 100$
BFS
本质就是找层序遍历过程中,每层的最后一个节点。
Java 代码:
| 1 |  | 
C++ 代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        vector<int> ans;
        if (!root) return ans;
        queue<TreeNode*> d;
        d.push(root);
        while (!d.empty()) {
            int sz = d.size();
            while (sz-- > 0) {
                TreeNode* node = d.front();
                d.pop();
                if (node->left) d.push(node->left);
                if (node->right) d.push(node->right);
                if (sz == 0) ans.push_back(node->val);
            }
        }
        return ans;
    }
};
Python 代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def rightSideView(self, root: Optional[TreeNode]) -> List[int]:
        ans = []
        if not root:
            return ans
        d = deque()
        d.append(root)
        while d:
            sz = len(d)
            while sz > 0:
                node = d.popleft()
                if node.left:
                    d.append(node.left)
                if node.right:
                    d.append(node.right)
                if sz == 1:
                    ans.append(node.val)
                sz -= 1
        return ans
TypeScript 代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */
function rightSideView(root: TreeNode | null): number[] {
    const ans = [];
    if (!root) return ans;
    const d = [];
    d.push(root);
    while (d.length > 0) {
        let sz = d.length;
        while (sz-- > 0) {
            const node = d.shift()!;
            if (node.left) d.push(node.left);
            if (node.right) d.push(node.right);
            if (sz === 0) ans.push(node.val);
        }
    }
    return ans;
};
- 时间复杂度:$O(n)$
- 空间复杂度:$O(n)$
DFS
DFS 解法同理,规定好节点的遍历顺序(例如 中-右-左),并在 DFS  过程中传递当前层参数 level(根节点为第 0 层),同时使用一个 Set 数据结构记录处理过的层编号,从而实现只将当前层的首个节点添加到答案中。
Java 代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<Integer> ans = new ArrayList<>();
    Set<Integer> set = new HashSet<>();
    public List<Integer> rightSideView(TreeNode root) {
        dfs(root, 0);
        return ans;
    }
    void dfs(TreeNode node, int level) {
        if (node == null) return ;
        if (!set.contains(level)) {
            ans.add(node.val);
            set.add(level);
        }
        dfs(node.right, level + 1);
        dfs(node.left, level + 1);
    }
}
C++ 代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> ans;
    unordered_set<int> levels;
    vector<int> rightSideView(TreeNode* root) {
        dfs(root, 0);
        return ans;
    }
    void dfs(TreeNode* node, int level) {
        if (!node) return;
        if (levels.find(level) == levels.end()) {
            ans.push_back(node->val);
            levels.insert(level);
        }
        dfs(node->right, level + 1);
        dfs(node->left, level + 1);
    }
};
Python 代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def rightSideView(self, root: Optional[TreeNode]) -> List[int]:        
        def dfs(node, level):
            if not node:
                return
            if level not in levels:
                ans.append(node.val)
                levels.add(level)
            dfs(node.right, level + 1)
            dfs(node.left, level + 1)
        ans = []
        levels = set()
        dfs(root, 0)
        return ans
TypeScript 代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     val: number
 *     left: TreeNode | null
 *     right: TreeNode | null
 *     constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
 *         this.val = (val===undefined ? 0 : val)
 *         this.left = (left===undefined ? null : left)
 *         this.right = (right===undefined ? null : right)
 *     }
 * }
 */
function rightSideView(root: TreeNode | null): number[] {
    const ans = [];
    const levels = new Set();
    function dfs(node: TreeNode | null, level: number) {
        if (!node) return;
        if (!levels.has(level)) {
            ans.push(node.val);
            levels.add(level);
        }
        dfs(node.right, level + 1);
        dfs(node.left, level + 1);
    }
    dfs(root, 0);
    return ans;
};
- 时间复杂度:$O(n)$
- 空间复杂度:$O(n)$
最后
这是我们「刷穿 LeetCode」系列文章的第 No.198 篇,系列开始于 2021/01/01,截止于起始日 LeetCode 上共有 1916 道题目,部分是有锁题,我们将先把所有不带锁的题目刷完。
在这个系列文章里面,除了讲解解题思路以外,还会尽可能给出最为简洁的代码。如果涉及通解还会相应的代码模板。
为了方便各位同学能够电脑上进行调试和提交代码,我建立了相关的仓库:https://github.com/SharingSource/LogicStack-LeetCode 。
在仓库地址里,你可以看到系列文章的题解链接、系列文章的相应代码、LeetCode 原题链接和其他优选题解。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!
