您需要在二叉树的每一行中找到最大的值。
示例 1:
Input: root = [1,3,2,5,3,null,9]
Output: [1,3,9]
示例 2:
Input: root = [1,2,3]
Output: [1,3]
示例 3:
Input: root = [1]
Output: [1]
示例 4:
Input: root = [1,null,2]
Output: [1,2]
示例 5:
Input: root = []
Output: []
提示:
- -2 ≤
Node.val
≤ 2 - 1 - The number of nodes in the tree will be in the range
[0, 104]
.
思路
广度优先遍历的基础题。维护一个队列,按照以下步骤走:
- 把
root
塞进队列; - 把
root
弹出队列,并把和root
相邻的节点塞进队列;被弹出队列的节点,意味着我们已经访问它了; - 每一层的元素由一个向量
vector<int> cur_layer
来记录,遍历完一层的元素,找到最大值,push
进答案向量中; - 当队列为空时,意味着所有的节点都访问过了,我们就退出,返回答案。
代码
/**
* 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) {}
* };
*/
class Solution {
public:
vector<int> largestValues(TreeNode* root) {
vector<int> ans;
if( nullptr == root ) return ans;
if( root->left == nullptr && root->right == nullptr ) {
ans.emplace_back( root->val );
return ans;
}
queue<TreeNode*> Q;
Q.push( root );
while( !Q.empty() ) {
int walk_length = Q.size();
vector<int> cur_layer;
for(int i = 0; i < walk_length; i++) {
TreeNode* cur_node = Q.front();
Q.pop();
cur_layer.emplace_back( cur_node->val );
if( cur_node->left != nullptr ) Q.push( cur_node->left );
if( cur_node->right != nullptr ) Q.push( cur_node->right );
}
ans.emplace_back( *max_element( cur_layer.begin(), cur_layer.end() ) );
}
return ans;
}
};