LongDz 的数字文墨提案

199. 二叉树的右视图

3 min

题目

二叉树的右视图 中等

解法:层序遍历

思路

第一段:使用广度优先搜索(BFS)进行层序遍历,每层取最后一个节点作为右视图节点。

第二段:BFS 能保证按层访问节点,当遍历到每层的最后一个节点时,该节点即为从右侧视角能看到的节点,因为右侧视角看到的是每层最靠右的节点。这种方法通过队列的先进先出特性,确保每层节点按从左到右的顺序处理,从而正确捕获每层的最右节点。

第三段:

  • Step 1: 初始化队列并将根节点入队
  • Step 2: 循环处理每一层,记录当前层节点数
  • Step 3: 遍历当前层所有节点,将最后一个节点的值加入结果
  • Step 4: 将子节点加入队列,继续下一层遍历

复杂度

  • 时间复杂度: O(n)O(n),其中 n 为节点数,每个节点仅被访问一次
  • 空间复杂度: O(n)O(n),最坏情况下队列需要存储所有节点

代码

class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        vector<int> ans;
        if (root == nullptr) return ans;

        deque<TreeNode*> dq;
        dq.push_back(root);

        while (!dq.empty()) {
            int size = dq.size();
            for (int i = 0; i < size; i++) {
                TreeNode* node = dq.front();
                dq.pop_front();

                if (i == size - 1) {
                    ans.push_back(node->val);
                }

                if (node->left) {
                    dq.push_back(node->left);
                }
                if (node->right) {
                    dq.push_back(node->right);
                }
class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        vector<int> ans;
        if (root == nullptr) return ans;

        deque<TreeNode*> dq;
        dq.push_back(root);

        while (!dq.empty()) {
            int size = dq.size();
            for (int i = 0; i < size; i++) {
                TreeNode* node = dq.front();
                dq.pop_front();

                if (i == size - 1) {
                    ans.push_back(node->val);
                }

                if (node->left) {
                    dq.push_back(node->left);
                }
                if (node->right) {
                    dq.push_back(node->right);
                }
            }
        }
        return ans;
    }
};