题目:Binary Tree Level Order Traversal
题目叙述
原题链接:https://leetcode.com/problems/binary-tree-level-order-traversal/#/description
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],
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
给出一个二叉树,返回层序遍历的结果,每一层的结果返回成一个数组。
例如:
二叉树如上图。
返回[ [3], [9,20], [15,7] ]
思路
用队列来模拟层序遍历,每次取出一个节点,把节点的左子树和右子树压入队列。
用一个firstLeft来表示每一层最左边的一个节点,findFirst表示是否已经找到每一层最左边的节点。
如果节点等于firstLeft,表示上一层已经遍历结束,把上一层的结果取出来,然后让findFirst等于false,接下来开始重复层序遍历的过程中,把遇到的一个孩子节点作为下一层的firstLeft,并让findFirst为true。
不要忘了层序遍历结束之后,最后一层的数据还没有取出来,所以还要再压一次。
参考代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
if(!root) return ans;
vector<int> temp;
queue<TreeNode*> q;
q.push(root);
TreeNode* firstLeft = NULL;
bool findFirst = false;
while(!q.empty()) {
TreeNode* front = q.front();
q.pop();
if(front == firstLeft) {
ans.push_back(temp);
temp.clear();
firstLeft = NULL;
findFirst = false;
}
temp.push_back(front->val);
if(front->left){
if(!findFirst) {
firstLeft = front->left;
findFirst = true;
}
q.push(front->left);
}
if(front->right) {
if(!findFirst) {
firstLeft = front->right;
findFirst = true;
}
q.push(front->right);
}
}
ans.push_back(temp);
return ans;
}
};