博客专栏地址:https://blog.csdn.net/feng964497595/category_9848847.html
github地址:https://github.com/mufeng964497595/leetcode
题目描述
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
思路解析
- 乍一看还挺难搞的,不过仔细分析一下,每一层只需要输出当前层的最后一个数字就可以了,那么这其实就是在考察二叉树的层次遍历~
- 这个层次遍历的变形,需要能够判断当前访问到的节点是不是当前层的最后一个节点。
- 有一种方法是,每个节点打上层数标记,如果队列中不存在下一个节点,或者下一个节点属于下一层了,那么就输出当前节点的值。
- 另一种方法是统计每层有几个节点,数到最后一个节点就打印。
- 示例代码用的是方法二。层次遍历属于基本功,这里就不赘述了~
示例代码
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
vector<int> ans;
if (!root) return ans;
// 层次遍历
queue<TreeNode*> qu;
qu.push(root);
int last_num = 1, num = 0;
int current = 0;
while (!qu.empty()) {
TreeNode* node = qu.front();
qu.pop();
if (node->left) {
qu.push(node->left);
++num; // 更新下一层的个数
}
if (node->right) {
qu.push(node->right);
++num; // 更新下一层的个数
}
++current;
if (current == last_num) { // 访问到当前层的最后一个
ans.push_back(node->val);
last_num = num;
num = 0;
current = 0;
}
}
return ans;
}
};