题目如下:官网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);
}
};