[LeetCode 102] Binary Tree Level Order Traversal

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).

For example: Given binary tree [3,9,20,null,null,15,7],

  3
 / \
9  20
  /  \
 15   7

return its level order traversal as:

[
  [3],
  [9,20],
  [15,7]
]

Diffculty Easy

Similar Problems [LeetCode 103] Binary Tree Zigzag Level Order Traversal Medium [LeetCode 107] Binary Tree Level Order Traversal II Easy [LeetCode 111] Minimum Depth of Binary Tree Easy [LeetCode 314] Binary Tree Vertical Order Traversal Medium

Analysis

层次递归是属于广度优先遍历,广度优先通常采用队列来解决。 主要有两种解决思路,一是用两个 queue 来分别保存前一层和当前层的节点,第二种是一个 queue 来保存节点,但是用两个变量来分别保存两层节点的数量。

Solutions

  1. 两个 queue
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode *root) {
        vector<vector<int>> res;
        if (root == nullptr) return res;
        queue<TreeNode*> currentLevel, nextLevel;
        currentLevel.push(root);
        vector<int> level;
        while (!currentLevel.empty()) {
            TreeNode *currNode = currentLevel.front();
            currentLevel.pop();
            if (currNode != nullptr) {
                level.push_back(currNode->val);
                nextLevel.push(currNode->left);
                nextLevel.push(currNode->right);
            }
            if (currentLevel.empty()) {
                if (level.size() != 0) {
                    res.push_back(level);
                    level.clear();
                }
                swap(currentLevel, nextLevel);
            }
        }
        return res;
    }
};
  1. 单个 queue
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode *root) {
        vector<vector<int> res;
        if (root == nullptr) return;
        queue<Node*> nodesQueue;
        int nodesInCurrentLevel = 0, nodesInNextLevel = 0;
        nodesQueue.push(root);
        ++nodesInCurrentLevel;
        vector<int> level;
        while (!nodesQueue.empty()) {
            Node *currNode = nodesQueue.front();
            nodesQueue.pop();
            nodesInCurrentLevel--;
            if (currNode != nullptr) {
                level.push_back(currNode->val);
                nodesQueue.push(currNode->left);
                nodesQueue.push(currNode->right);
                nodesInNextLevel += 2;
            }
            if (nodesInCurrentLevel == 0) {
                res.push_back(level);
                level.clear();
                nodesInCurrentLevel = nodesInNextLevel;
                nodesInNextLevel = 0;
            }
        }
        return res;
    }
};

results matching ""

    No results matching ""