Leetcode199、二叉树侧视图(从侧面观察二叉树)

1、问题

给定一个二叉树,假设从该二叉树的右侧观察它,将观察到的节点按照从 上到下的顺序输出。

2、思考与分析

从二叉树的右侧观察它,将观察到的节点按照从上到下的顺序输出,就是求层次遍历二叉树,每层中的最后一个节点。

3、算法思路

层次遍历时,将节点与层数绑定为pair,压入队列时,将节点与层数同时压入到队列中,并记录每一层中出现的最后一个节点。

在层次遍历中,每一层中的最后一个节点最后遍历到,随时更新对每层的最后一个节点即可。

4、代码

#include <iostream>
#include <queue>
#include <vector>

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> view; // view[i] 表示第i层的最后一个节点,i从0开始
        if ( !root )
            return view;

        // 队列中的元素是 <节点, 层数>
        queue< pair< TreeNode*, int > > Q;

        if ( root )
            Q.push( make_pair(root, 0) );

        while ( !Q.empty() )
        {
            // 记录一下首元素,然后将其弹出
            TreeNode* node = Q.front().first;
            int depth = Q.front().second;
            Q.pop();

            // 对view的更新,有两种情况
            // 1)view[i] 还没有,直接push即可
            // 2)view[i] 已经存在,但不是最右边的值,需要将其替换
            if ( view.size() == depth)
                view.push_back( node->val );
            else
            {
                // view.pop_back();
                // view.push_back( node->val );
                view[view.size() - 1] = node->val;
            }

            if ( node->left )
                Q.push( make_pair( node->left, depth + 1));
            if ( node->right )
                Q.push( make_pair( node->right, depth + 1));
        }
        return view;
    }
};

int main()
{
    TreeNode a(1);
    TreeNode b(2);
    TreeNode c(3);
    TreeNode d(5);
    TreeNode e(4);
    TreeNode f(6);

    a.left = &b;
    a.right = &c;
    b.right = &d;
    c.right = &e;
    d.left = &f;

    vector<int> view;
    Solution S;
    view = S.rightSideView(&a);

    for (int i = 0; i < view.size(); i++)
    {
        cout << view[i] << endl;
    }

    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。