力扣 #199 二叉树的右视图(C++)

题目如下:官网oj

在这里插入图片描述

法一 层次遍历(BFS)

  题目要求返回每一层的最右侧节点,我们按照层次遍历二叉树,每当遇到最右边的节点,就加入到答案中。当遍历第n层的时候,得到的子节点入队列,当n层的节点全部pop之后,剩下的节点就是n+1层的节点,同理,当遍历第n+1层的时候,得到的子节点入队列,当n+1层的节点全部pop之后,剩下的节点就是n+2层的节点 …不难得到下面的代码:

class Solution {
    
    
public:
    vector<int> rightSideView(TreeNode* root) {
    
    
        if(root==nullptr)
            return {
    
    };

        queue<TreeNode*> Q;
        int size;
        vector<int> ans;

        Q.push(root);
        while(!Q.empty()){
    
    
        	//size为这一层的节点个数
            size=Q.size();
            //只遍历size个节点,剩下的节点就是下一层的节点
            for(int i=0;i<size;i++){
    
    
                TreeNode *tmp=Q.front();
                Q.pop();
                if(tmp->left!=nullptr)
                    Q.push(tmp->left);
                if(tmp->right!=nullptr)
                    Q.push(tmp->right);
                if(i==size-1)
                    ans.push_back(tmp->val);
            }
        }
        return ans;
    }
};

法二 DFS

  先遍历二叉树的右子树再遍历二叉树的左子树,从根开始遍历,这样就能保证第一个访问到的就是最右的节点,配和一个bool数组记录第i层是否已经记录了最右节点,得到下面代码:

class Solution {
    
    
public:
    vector<int> rightSideView(TreeNode* root) {
    
    
        vector<int> ans;
        bool vis[1000];
		//初始化为false
        memset(vis,false,sizeof(vis));
        //从root开始遍历,一开始为第0层,答案保存在ans中,传入bool数组vis
        dfs(root,0,ans,vis);
        return ans;
    }
    
    void dfs(TreeNode *root,int k,vector<int> &ans,bool vis[]){
    
    
        if(root==nullptr)
            return;
		//vis[k]为false说明 遇到了k层的最右侧节点
        if(!vis[k]){
    
    
            ans.push_back(root->val);
            vis[k]=true;
        }
        dfs(root->right,k+1,ans,vis);
        dfs(root->left,k+1,ans,vis);
    }
};

猜你喜欢

转载自blog.csdn.net/Raymond_YP/article/details/108987920
今日推荐