【C++】每日一题 199. 二叉树的右视图

发布于:2024-05-10 ⋅ 阅读:(21) ⋅ 点赞:(0)

给定一个二叉树的 根节点 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)。