二叉树的层序遍历(Leetcode 102 中等)
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。(即逐层地,从左到右访问所有节点)。
二叉树:[3,9,20,null,null,15,7],
今天的题目比较简单,主要的目的是讲解一下队列的应用。二叉树的层序遍历时一种典型的广度优先搜索,即每次搜索时,先搜索当前节点的所有附近节点,逐步推进,与层序遍历一致。
所谓队列,即序列中元素满足先进先出的原则的数据结构。由于层序遍历中,我们需要对每一层从左到右进行遍历,而对于每一个子节点,如果他在另一个子节点的左侧,则其母节点与该节点相同或在其母节点左侧,因此层序遍历中节点满足先进先出原则,可以使用队列这种数据结构。
具体的解法是把每一层的节点放进一个队列中,在出队列时,再将其子节点放入下一层的队列中,二叉树的结构和队列的先进先出特性保证了结果的正确性。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
queue<TreeNode*> this_level;
queue<TreeNode*> next_level;
vector<vector<int> > ans;
vector<int> single_level;
if( root == NULL ) return vector<vector<int>>();
this_level.push(root);
TreeNode* cur_node;
while( !this_level.empty() ) {
single_level.clear();
while( !this_level.empty() ) {
cur_node = this_level.front();
single_level.push_back(cur_node->val);
if( cur_node->left != NULL ) {
next_level.push(cur_node->left);
}
if( cur_node->right != NULL ) {
next_level.push(cur_node->right);
}
this_level.pop();
}
ans.push_back(single_level);
while( !next_level.empty() ) {
this_level.push(next_level.front());
next_level.pop();
}
}
return ans;
}
};
二叉树的层序遍历二(Leetcode 107 中等)
给定一个二叉树,返回其节点值自底向上的层序遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
给定二叉树 [3,9,20,null,null,15,7],
解法基本和上一题相同,需要将不同的层进行反序,只需要先将结果存在一个栈中,再从栈中取出即可。
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
queue<TreeNode*> this_level;
queue<TreeNode*> next_level;
vector<vector<int> > ans;
stack<vector<int> > temp_ans;
vector<int> single_level;
if( root == NULL ) return vector<vector<int>>();
this_level.push(root);
TreeNode* cur_node;
while( !this_level.empty() ) {
single_level.clear();
while( !this_level.empty() ) {
cur_node = this_level.front();
single_level.push_back(cur_node->val);
if( cur_node->left != NULL ) {
next_level.push(cur_node->left);
}
if( cur_node->right != NULL ) {
next_level.push(cur_node->right);
}
this_level.pop();
}
temp_ans.push(single_level);
while( !next_level.empty() ) {
this_level.push(next_level.front());
next_level.pop();
}
}
while( !temp_ans.empty() ) {
ans.push_back(temp_ans.top());
temp_ans.pop();
}
return ans;
}
};