LeetCode 515 Find Largest Value in Each Tree Row

LeetCode 515 Find Largest Value in Each Tree Row

By Jalan

知识工具需求

数据结构和算法

树的层序遍历

题解

第一次

思路

需要统计树的每层的一些信息
采用层序遍历,并且对每层的末尾有个标记.
可以采用递归或非递归.
一般这种有标记的,非递归写起来快一点,而且不需要全局变量.

  1. 判断边界条件
  2. 遍历树,遍历过程中遇到层结尾标记的时候统计本层信息.
  3. 返回
    第一次采用非递归,和第二次只有BFS函数不一样,rowSize 是层结束标记,rowMax是层需要的统计信息.

预期时间复杂度

O(n)

编写用时

2年没写题了,这个居然写了20分钟…

代码

CPP
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
#include <climits>
#include <functional>
#include <iostream>
#include <new>
#include <queue>
#include <type_traits>
#include <vector>
struct TreeNode {
    int       val;
    TreeNode* left;
    TreeNode* right;
    TreeNode() : val( 0 ), left( nullptr ), right( nullptr ) {}
    TreeNode( int x ) : val( x ), left( nullptr ), right( nullptr ) {}
    TreeNode( int x, TreeNode* left, TreeNode* right ) : val( x ), left( left ), right( right ) {}
};

using namespace std;
class Solution
{
public:
    void BFS( TreeNode* root, vector< int >& answers )
    {
        queue< TreeNode* > q;
        q.push( root );
        int rowSize = 1;
        int rowMax  = INT_MIN;
        while ( !q.empty() ) {
            //出队
            TreeNode* top = q.front();
            if ( top->val > rowMax ) {
                rowMax = top->val;
            }
            rowSize--;
            q.pop();

            //入队
            if ( top->left != nullptr ) {
                q.push( top->left );
            }
            if ( top->right != nullptr ) {
                q.push( top->right );
            }

            if ( rowSize == 0 ) {
                answers.emplace_back( rowMax );
                rowMax  = INT_MIN;
                rowSize = q.size();
            }
        }
    };
    vector< int > largestValues( TreeNode* root )
    {
        //采用队列遍历整个树.answers保存每层的最大值
        vector< int > answers;
        //判空
        if ( root == nullptr ) {
            return answers;
        }
        //遍历
        BFS( root, answers );
        //返回
        return answers;
    }
};
int main( int argc, const char** argv )
{
    Solution  s;
    TreeNode* root     = new TreeNode( 1 );
    root->left         = new TreeNode( 3 );
    root->right        = new TreeNode( 2 );
    root->left->left   = new TreeNode( 5 );
    root->left->right  = new TreeNode( 3 );
    root->right->right = new TreeNode( 9 );
    auto ans           = s.largestValues( root );

    return 0;
}

运行用时

结尾

看在我写了这么多注释的份上可以给我点个赞嘛,求求惹=]砰砰砰,给我加点写下去的油呀
@.@
也欢迎关注我的CSDN账号呀=]

                                        **开心code每一天**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值