原题目:
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 ;