Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[LeetCode] 199. Binary Tree Right Side View #199

Open
grandyang opened this issue May 30, 2019 · 4 comments
Open

[LeetCode] 199. Binary Tree Right Side View #199

grandyang opened this issue May 30, 2019 · 4 comments

Comments

@grandyang
Copy link
Owner

grandyang commented May 30, 2019

 

Given a binary tree, imagine yourself standing on the  right  side of it, return the values of the nodes you can see ordered from top to bottom.

For example:
Given the following binary tree,

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

 

You should return [1, 3, 4].

Credits:
Special thanks to @amrsaqr for adding this problem and creating all test cases.

 

这道题要求我们打印出二叉树每一行最右边的一个数字,实际上是求二叉树层序遍历的一种变形,我们只需要保存每一层最右边的数字即可,可以参考我之前的博客 Binary Tree Level Order Traversal 二叉树层序遍历,这道题只要在之前那道题上稍加修改即可得到结果,还是需要用到数据结构队列queue,遍历每层的节点时,把下一层的节点都存入到queue中,每当开始新一层节点的遍历之前,先把新一层最后一个节点值存到结果中,代码如下:

 

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> rightSideView(TreeNode *root) {
        vector<int> res;
        if (!root) return res;
        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty()) {
            res.push_back(q.back()->val);
            int size = q.size();
            for (int i = 0; i < size; ++i) {
                TreeNode *node = q.front();
                q.pop();
                if (node->left) q.push(node->left);
                if (node->right) q.push(node->right);
            }
        }
        return res;
    }
};

 

LeetCode All in One 题目讲解汇总(持续更新中...)

@lld2006
Copy link

lld2006 commented Jul 23, 2020

推荐一下discussion里面c++ 高票解法, 利用变形前序访问来求得right view. 变量level设置的非常巧妙

class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
      vector<int> ret;
      helper(root, 1, ret);
      return ret;
    }
    void helper(TreeNode* node, int level, vector<int>& values){
      if(!node) return; 
      if(values.size() < level) values.push_back(node->val);
      helper(node->right, level+1, values);
      helper(node->left, level+1, values);
    }
};

@lei-hsia
Copy link

楼主,我想问一个有可能听起来很蠢的想法,为什么不能直接node.right遍历,把每个val放到res中,直到node.right为空?这样做感觉好像没有问题,但是写出来就TLE

@zyliuOS
Copy link

zyliuOS commented Feb 6, 2021

楼主,我想问一个有可能听起来很蠢的想法,为什么不能直接node.right遍历,把每个val放到res中,直到node.right为空?这样做感觉好像没有问题,但是写出来就TLE

如果左子树的深度大于右子树,这样可能不行,我一开始也是按照你这思路写,倒是没有TLE,只是OJ过不了

@Syl-Ying
Copy link

  1⃣️
       ↘️
             2⃣️
        ↙️
   3⃣️

这种情况,如果一直dfs(node.right)来遍历右子树,就没办法捉到左子节点3了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants