题目

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

示例 1:
1.jpg

  1. 输入: [1,2,3,null,5,null,4]
  2. 输出: [1,3,4]

示例 2:

输入: [1,null,3]
输出: [1,3]

示例 3:

输入: []
输出: []

提示:

  • 二叉树的节点个数的范围是 [0,100]
  • -100 <= Node.val <= 100

    解题方法

    迭代法(BFS)

    迭代法,从右向左层序遍历,将每一层的队列头部元素压入数组。
    时间复杂度O(n),空间复杂度O(n)
    C++代码:

    /**
    * 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;
          queue<TreeNode*> nodes;
          if(root!=NULL)  nodes.push(root);
    
          while(nodes.size()>0) {
              int size = nodes.size();
              result.push_back(nodes.front()->val);
              for(int i=0; i<size; i++) {
                  if(nodes.front()->right != NULL)    nodes.push(nodes.front()->right);
                  if(nodes.front()->left != NULL)     nodes.push(nodes.front()->left);
                  nodes.pop();
              }
          }
    
          return result;
      }
    };
    

    DFS

    深度优先搜索,维护最大深度,使用 map 记录每层最右侧的节点。
    时间复杂度O(n),空间复杂度O(n)
    C++代码:

    /**
    * 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;
          map<int, int> rightview;
          stack<TreeNode*> nodes;
          stack<int> depth;
          int maxdepth = -1;
    
          if(root==NULL)  return result;  
          nodes.push(root);
          depth.push(0);
          while(nodes.size()>0) {
              TreeNode *tmp = nodes.top(); nodes.pop();
              int d = depth.top(); depth.pop();
    
              if(tmp!=NULL) {
                  maxdepth = max(maxdepth, d);
                  if(rightview.find(d)==rightview.end())  rightview[d] = tmp->val;
                  nodes.push(tmp->left);
                  depth.push(d+1);
                  nodes.push(tmp->right);
                  depth.push(d+1);
              }
          }
    
          for(int i=0; i<=maxdepth; i++)   result.push_back(rightview[i]);
    
          return result;
      }
    };