199. 二叉树的右视图

  • 199. 二叉树的右视图

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

    示例 1:

    img

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

    示例 2:

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

    示例 3:

    输入: []
    输出: []
    

    提示:

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

思路:

BFS:

class Solution {
public:
    vector<int>ans;
    //采用BFS深度优先搜索
    vector<int> rightSideView(TreeNode* root) {
        if(root==nullptr)return ans;
        queue<TreeNode*>pq;//BFS核心数据结构
        pq.push(root);
        while(!pq.empty()){
            int sz=pq.size();
            //队列的顶部元素就是能看见的节点数,即最右侧元素
            TreeNode* cur=pq.front(); 
            for(int i=0;i<sz;i++){
                TreeNode* p=pq.front();
                pq.pop();
                //注意,这里要从右向左判断,才能保证队列顶部元素是最右侧元素
                if(p->right!=nullptr)pq.push(p->right);
                if(p->left!=nullptr)pq.push(p->left);
            }
            ans.push_back(cur->val);
        }
        return ans;
    }
};

DFS:

本题使用DFS深度优先搜索要想到ans容器中元素数量和二叉树深度的关系,同时要注意遍历时要先去遍历右子树再去遍历左子树

class Solution {
public:
    //DFS
    vector<int> ans;
    //记录递归的层数
    int dep=0;
    vector<int> rightSideView(TreeNode* root) {
        traver(root);
        return ans;
    }
    //二叉树遍历
    void traver(TreeNode* root){
        if(root==nullptr)return;
        //前序遍历
        dep++;
        if(ans.size()<dep){
            //这一层没有记录值
            //说明root就是右侧视图的第一个节点
            ans.push_back(root->val);
        }
        //这里要先遍历右子树再去遍历左子树
        //这样首先遍历的一定是右侧节点
        traver(root->right);
        traver(root->left);
        //回到上一层
        dep--;
    }
};
posted @ 2022-04-14 10:30  BailanZ  阅读(29)  评论(0编辑  收藏  举报