515. Find Largest Value in Each Tree Row(Medium)

本文介绍了一种算法,用于解决寻找二叉树每一层最大值的问题。通过层序遍历并结合优先队列(大顶堆),该算法可以在O(n)的时间复杂度内完成。文中还详细介绍了priority_queue的使用方法。

原题目:
  You need to find the largest value in each row of a binary tree.

Example:

Input:

      1
     / \
    3   2
   / \   \  
  5   3   9 

Output: [1, 3, 9]

题目大意如下:
  在给定二叉树中找到每一行中最大的数。

解题思路:
  层序遍历,在每一层遍历完之后输出当前层最大的树,这一步可以借助于priority_queue或者set。

代码如下:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    //define compare function
    struct cmp{  
        //函数适配器
        bool operator () (TreeNode* r1, TreeNode* r2) {
            return r1->val < r2->val ;
        }
    };  
    vector<int> largestValues(TreeNode* root) {
        priority_queue<TreeNode*, vector<TreeNode*>,cmp> q ;
        vector<int> v ;
        int size ;
        queue<TreeNode*> queue ;
        if(root == NULL) return v ;
        q.push(root) ;
        v.push_back(root->val) ;
        while(!q.empty()){
            size = q.size() ;
            //q is used to store all nodes in each row(ordered)
            for(int i = 0 ; i < size ; ++i){
                queue.push(q.top() ) ;
                q.pop() ;
            }
            //queue is used to store all nodes in each row(unordered)
            while(!queue.empty()){
                if((queue.front() )->left != NULL) q.push((queue.front())->left );
                if((queue.front() )->right != NULL) q.push((queue.front())->right );
                queue.pop() ;
            }
            //v is used to store the greatest one in each row
            if(!q.empty() ) v.push_back(q.top()->val) ;
        }
        return v ;
    }
};

运行结果:
运行结果

算法分析:
  最坏为O(N²),如果树为平衡的,则为O(n)。

知识补充:
  STL中priority_queue的使用:
  它的模板声明带有三个参数,priority_queue< Type, Container, compareFunctional>
Type 为数据类型, Container 为保存数据的容器,compareFunctional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面两个
参数缺省的话,优先队列就是大顶堆,队头元素最大。
  
自定义数据类型时:

struct cmp{  
        bool operator () (TreeNode* r1, TreeNode* r2) {
            return r1->val < r2->val ;
            //定义比较函数,<表示从大到小排列
        }
 };  
        priority_queue<TreeNode*, vector<TreeNode*>,cmp> q ;
        //当有第三个参数时,必定也要有第二个参数

除自己写仿函数之外,还可以重载比较函数operator<。
为什么要用括号——因为用了适配器的概念。

基本数据类型时:
STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆。

priority_queue<int, vector<int>,greater<int>> q ;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值