美文网首页
Leetcode199、二叉树侧视图(从侧面观察二叉树)

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

作者: 残剑天下论 | 来源:发表于2020-06-01 12:39 被阅读0次

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;
}

相关文章

  • 数据结构与算法-二叉树02

    二叉树的定义 二叉树的特点 二叉树的五中基本形态 其他二叉树 斜二叉树 满二叉树 完全二叉树图片.png满二叉树一...

  • 二叉树的遍历

    二叉树的遍历 一、二叉树的遍历 二叉树的遍历(traversing binary tree)是指从根结点出发,按照...

  • 二、二叉树的基本概念

    满二叉树就是除了最底层的节点以外,其他节点都有两个孩子。 完全二叉树 完全二叉树包含满二叉树,就是从右边往左边依次...

  • 二叉树

    二叉树 高度 深度真二叉树 满二叉树 完全二叉树 二叉树遍历前序 中序 后序层序遍历 翻转二叉树 递归法...

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • 66_二叉树结构的层次遍历

    关键词:二叉树的层次遍历 0. 二叉树的遍历 二叉树的遍历是指:从根结点出发,按照某种次序依次访问二叉树中的所有结...

  • 树与二叉树

    **树 ** 二叉树 满二叉树 完全二叉树 三种遍历方法 树与二叉树的区别 二叉查找树 平衡二叉树 红黑二叉树

  • 数据结构 - 二叉树(Binary Tree)

    1、二叉树定义和特点 1.1、定义 1.2、特点 2、二叉树的遍历 从根节点出发,按照某种次序依次访问二叉树中所有...

  • 二叉树的宽度优先搜索(层次遍历,BFS)

    二叉树结构: 二叉树宽度优先搜索: 按照二叉树的层数依次从左到右访问二叉树的节点;例如:给定一个二叉树: 按照宽度...

  • 剑指 offer:39、平衡二叉树

    39. 平衡二叉树 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 解题思路: 平衡二叉树:Wiki:在...

网友评论

      本文标题:Leetcode199、二叉树侧视图(从侧面观察二叉树)

      本文链接:https://www.haomeiwen.com/subject/lohuzhtx.html