给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
思路:
可以使用广度优先搜索(BFS)来遍历二叉树,但是在遍历过程中只记录每一层最右侧的节点值。这样最后记录的节点值就是从右侧看到的节点值
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
// 二叉树节点结构
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
class Solution {
public:
vector<int> rightSideView(TreeNode* root) {
vector<int> result;
if (!root) return result;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int size = q.size();
TreeNode* rightmost = nullptr;
for (int i = 0; i < size; ++i) {
TreeNode* node = q.front();
q.pop();
// 更新当前层最右侧的节点
rightmost = node;
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
// 将当前层最右侧的节点值加入结果集
result.push_back(rightmost->val);
}
return result;
}
};
int main() {
// 创建二叉树
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->right = new TreeNode(5);
root->right->right = new TreeNode(4);
// 创建解决方案对象
Solution solution;
// 获取从右侧所能看到的节点值
vector<int> result = solution.rightSideView(root);
// 输出结果
cout << "From right side view, the node values are: ";
for (int val : result) {
cout << val << " ";
}
cout << endl;
// 释放内存
delete root->left->right;
delete root->right->right;
delete root->left;
delete root->right;
delete root;
return 0;
}
时间复杂度分析:
BFS遍历二叉树需要访问每个节点恰好一次,因此时间复杂度为 O(n),其中 n 是二叉树中的节点数。
空间复杂度分析:
在最坏情况下,队列中可能会存储二叉树中的所有叶子节点,即二叉树的最后一层。对于完全二叉树,最后一层的节点数量为 n/2,其中 n 是节点总数。因此,空间复杂度为 O(n)。