LeetCode102 二叉树的层次遍历

题目描述:

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [3,9,20,null,null,15,7],

    3
   / 
  9  20
    /  
   15   7

返回其层次遍历结果:

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




/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
/*
算法思想:
    进行常规层次遍历,需要借助一个队列。
    先将根节点入队,然后出队,访问该结点,如果它有左子树,则将左子树根节点入队;若果它有右子树,则将右子树根结点入队。然后出队,访问该结点,如此反复,直至队列为空。
补充:
queue 的基本操作有:
入队,如例:q.push(x); 将x 接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
判断队列空,如例:q.empty(),当队列空时,返回true。
访问队列中的元素个数,如例:q.size()
*/
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        
        vector<vector<int>>v;
        
        queue<TreeNode*>q;  //---
        q.push(root);  //根节点入队---
        
        if(root == NULL)  
            return v ;
        while(!q.empty()){  //队列不空
            vector<int>vv;
            queue<TreeNode*> next ;  //  建立第二个队列 用来存放下一层的结点
            while(!q.empty()){  //遍历当前层的结点  这层循环是核心 其他都是为了满足OJ二维向量输出---
                
                TreeNode* tre = q.front() ;
                vv.push_back(tre->val);  //访问该结点,为了满足输出要求,所以有点复杂,
                q.pop();  //对头元素出队
                if(tre->left!=NULL){  //它有左子树
                    next.push(tre->left);
                }
                if(tre->right!=NULL){  //它有右子树
                    next.push(tre->right);
                }
                
            }   //---
            v.push_back(vv);
            q=next;  // // 遍历完后进入下一层 
        }
        return v;
    }
};
原文地址:https://www.cnblogs.com/parzulpan/p/9924684.html