您需要在二叉树的每一行中找到最大的值。

示例 1:

在每个树行中找最大值-515 - 图1

  1. Input: root = [1,3,2,5,3,null,9]
  2. Output: [1,3,9]

示例 2:

  1. Input: root = [1,2,3]
  2. Output: [1,3]

示例 3:

  1. Input: root = [1]
  2. Output: [1]

示例 4:

  1. Input: root = [1,null,2]
  2. Output: [1,2]

示例 5:

  1. Input: root = []
  2. Output: []

提示:

  • -2 ≤ Node.val ≤ 2 - 1
  • The number of nodes in the tree will be in the range [0, 104].

思路

广度优先遍历的基础题。维护一个队列,按照以下步骤走:

  1. root塞进队列;
  2. root弹出队列,并把和root相邻的节点塞进队列;被弹出队列的节点,意味着我们已经访问它了;
  3. 每一层的元素由一个向量vector<int> cur_layer来记录,遍历完一层的元素,找到最大值,push进答案向量中;
  4. 当队列为空时,意味着所有的节点都访问过了,我们就退出,返回答案。

代码

  1. /**
  2. * Definition for a binary tree node.
  3. * struct TreeNode {
  4. * int val;
  5. * TreeNode *left;
  6. * TreeNode *right;
  7. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  8. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  10. * };
  11. */
  12. class Solution {
  13. public:
  14. vector<int> largestValues(TreeNode* root) {
  15. vector<int> ans;
  16. if( nullptr == root ) return ans;
  17. if( root->left == nullptr && root->right == nullptr ) {
  18. ans.emplace_back( root->val );
  19. return ans;
  20. }
  21. queue<TreeNode*> Q;
  22. Q.push( root );
  23. while( !Q.empty() ) {
  24. int walk_length = Q.size();
  25. vector<int> cur_layer;
  26. for(int i = 0; i < walk_length; i++) {
  27. TreeNode* cur_node = Q.front();
  28. Q.pop();
  29. cur_layer.emplace_back( cur_node->val );
  30. if( cur_node->left != nullptr ) Q.push( cur_node->left );
  31. if( cur_node->right != nullptr ) Q.push( cur_node->right );
  32. }
  33. ans.emplace_back( *max_element( cur_layer.begin(), cur_layer.end() ) );
  34. }
  35. return ans;
  36. }
  37. };