image.png

思路:二叉树的层次遍历

  • cur_level_size == q.size() 当前层的大小就是当前队列的大小,这一点是逐层操作的关键所在。
  • 非常模式化的题目,代码要尽量理解记忆。

代码:

  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. // 层次遍历二叉树,注意分层即可
  16. vector<int> res;
  17. if (!root) {
  18. return res;
  19. }
  20. queue<TreeNode*> q;
  21. q.push(root);
  22. while(!q.empty()) {
  23. // 这个理解很重要,当前队列的大小就是当前层的大小
  24. int cur_level_size = q.size();
  25. int cur_level_max = INT_MIN;
  26. // cur_level_size 减到0,意味着一层已经全部读完了
  27. while (cur_level_size--){
  28. TreeNode* node = q.front();
  29. cur_level_max = max(cur_level_max, node->val);
  30. q.pop();
  31. if (node->left) {
  32. q.push(node->left);
  33. }
  34. if (node->right) {
  35. q.push(node->right);
  36. }
  37. }
  38. res.push_back(cur_level_max);
  39. }
  40. return res;
  41. }
  42. };