题目描述:
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [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; } };