前言
BFS,其英文全称是Breadth First Search。 BFS并不使用经验法则算法。从算法的观点,所有因为展开节点而得到的子节点都会被加进一个先进先出的队列中。目的是系统地展开并检查图中的所有节点,以找寻结果。
题目详情
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
1 <---
/ \
2 3 <---
\ \
5 4 <---
——题目难度:中等
大致思路
红色结点自上而下组成答案,边缘以访问顺序标号。(来源: 力扣(LeetCode) )
使用宽度优先搜索,将每层最后一个节点的val保存在结果数组ans中。
-下面代码
/**
* Definition for a binary tree node.
* 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) {
if(!root) return {};
vector<int> ans; //ans用来存储所需的节点值
queue<TreeNode*> que; //创建一个队列que
que.push(root); //在队尾(此时是最前位置)插入root
//BFS
while(!que.empty()){ //如果队列为空返回true,为空也说明已经遍历完整棵树了
int count = que.size(); //用que.size()函数返回每一层的节点数
for(int i=0;i<count;i++)
{
auto node = que.front(); //auto node可进行自动类型判断,node接受队列que中的第一个元素
que.pop(); //将队列que中最前面位置的元素去除
if(node->left) que.push(node->left); //如果node->left不为NULL则让node->left加入队列
if(node->right) que.push(node->right); //如果node->right不为NULL则让node->right加入队列
if(i==count-1) ans.push_back(node->val); //i==count-1, 则此时node为每一层最后一个节点,则使之加入结果数组
}
}
return ans;
}
};