【力扣-二叉树】3、二叉树的右视图(199)

129 阅读2分钟

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

199. 二叉树的右视图

题目描述

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

示例 1:

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

示例 2:

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

示例 3:

输入: []
输出: []

提示:

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

解析

最容易想到的解决方法:从右侧看到的是每一层的最右边的一个节点,所以可以使用层序遍历来解决此题 步骤

  • 添加一个数组
  • 对层序遍历的结果数组中的元素进行筛选
  • 选出每一层的最后一个节点

基于层序遍历

/**
 * 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<vector<int>> result;
        // 层序遍历,使用队列来存放节点
        queue<TreeNode*>que;
        if(root!=NULL){
            que.push(root);
        }
        // 遍历
        while(!que.empty()){
            // 确定每一层的元素个数
            int size = que.size();
            vector<int> v;
            for(int i = 0;i<size;i++){
                TreeNode *node = que.front();
                que.pop();
                v.push_back(node->val);
                // 左 
                if(node->left){
                    que.push(node->left);
                }
                //右
                if(node->right){
                    que.push(node->right);
                }
            }
            result.push_back(v);
        }
        // 上面全是层序遍历的代码
        // 下面是选择每层可以看到的节点,最后返回新的数组
        vector<int> ret;
        for(int i = 0 ; i <result.size();i++){
            int index = result[i].size();
            // 将每一层的最后一个元素加入到结果集
            ret.push_back(result[i][index-1]);
        }
        return ret;

    }
};

image.png

改进代码

遍历每一层的时候,判断是否遍历到这一层的最后一个节点,如果是最后一个就将其对应的值存入结果数组中。

/**
 * 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) {
        // 层序遍历
        // 使用队列来存储节点
        queue<TreeNode*>que;
        if(root!=NULL){
            que.push(root);
        }
        // 存放符合条件的节点值
        vector<int> result;
           
        // 遍历
        while(!que.empty()){
            int size = que.size();
            for(int i = 0;i<size;i++){
                TreeNode *node = que.front();
                que.pop();
                // 判断是否遍历到本层的最后一个节点,如果是,就将其值存入数组中
                // 其他节点的值不进行存储
                if(i == size-1){
                    result.push_back(node->val);
                }
                // 左
                if(node->left){
                    que.push(node->left);
                }
                
                // 右
                if(node->right){
                    que.push(node->right);
                }
            }
        }
        // 返回结果
        return result;

    }
};

image.png