leetcode 链接:二叉树的右视图

题目

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例:

  1. 输入: [1,2,3,null,5,null,4]
  2. 输出: [1, 3, 4]
  3. 解释:
  4. 1 <---
  5. / \
  6. 2 3 <---
  7. \ \
  8. 5 4 <---
输入: [1,2,3,null,5]
输出: [1, 3, 5]
解释:

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

解答 & 代码

使用二叉树层序遍历,将每一层最右边的节点存到 result 数组中

/**
 * 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> result;
        if(!root)                // 特殊情况,树为空,直接返回空的结果
            return result;

        queue<TreeNode*> nodeQ;    // 存储结点指针的队列,用于层序遍历
        nodeQ.push(root);        // 将头节点压入队列
        while(!nodeQ.empty())
        {
            int nodeNum = nodeQ.size();            // 当前层的节点数
            for(int i = 0; i < nodeNum; ++i)    // 遍历当前层的所有节点
            {
                TreeNode* node = nodeQ.front();    // 从队列中取出头节点
                nodeQ.pop();                    // 并弹出

                if(i == nodeNum - 1)            // 如果是当前层最后一个节点,存入到结果数组中
                    result.push_back(node->val);

                if(node->left)                    // 如果左子树不为空,压入队列
                    nodeQ.push(node->left);
                if(node->right)                    // 如果右子树不为空,压入队列
                    nodeQ.push(node->right);
            }
        }

        return result;
    }
};

执行结果:

执行结果:通过

执行用时:4 ms, 在所有 C++ 提交中击败了 72.28% 的用户
内存消耗:11.8 MB, 在所有 C++ 提交中击败了 37.51% 的用户