LeetCode 102. Binary Tree Level Order Traversal 二叉树的层次遍历/广度优先遍历

1.题目

返回二叉树的层次遍历。

 

2.思路

节点的访问次序可概括为“先上后下,先左后右”——先访问根节点,再依次是左子节点,右子节点,左子节点的左子节点,左子节点的右子节点,右子节点的左子节点,右子节点的右子节点……以此类推。

 

3.实现

3.1 非递归版本

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> results;
        if(root == nullptr)
            return res;
        
        queue<TreeNode*> q;
        q.push(root);
        
        while(!q.empty())
        {
            int size = q.size();
            vector<int> result;
            for(int i = 1; i <= size; i++)
            {
                TreeNode* node = q.front();
                q.pop();
                result.push_back(node->val);
                if(node->left != nullptr) q.push(node->left);
                if(node->right != nullptr) q.push(node->right);
            }
            results.push_back(result);
        }
        
        return results;
    }
};

3.2 递归版本

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> results; 
        if(root == nullptr)
            return results; 
        
        helper(root, 0, results); //根节点 在 level = 0层
        return results;
    }
private:
    void helper(TreeNode* root, int level, vector<vector<int>>& results)
    {
        // 将level层的全部节点组成的向量 添加到results中
        
        if(root == nullptr)
            return;
        if(results.size() == level)  //例如level = 2 是已经添加了 level = 0,1层的元素,results.size() = 2  此时可以创建新的向量存放  level = 2 层的节点值
            results.push_back(vector<int>()); //空向量
        
        results[level].push_back(root->val);  //最主要的是这个level
        helper(root->left, level + 1, results);
        helper(root->right, level + 1, results);
        
        
    }
};

 

 

猜你喜欢

转载自blog.csdn.net/u014128608/article/details/92852514