基础:掌握二叉树的层序遍历
难点:如何将每层的val放在一个vector中 并push到大的vector中
初次实现(创建两个队列):
将root根结点push到q1中,将q1中的所有结点的val存入小vector,再将小vector存入大vector
然后,将q1中的所有结点的左右子树依次push到q2中,继续交换重复上述动作。
以此循环直到两个队列中都没有元素,即遍历完毕!
交换重复:当q1中所有元素都遍历完了,此时q1为空队,而q2在q1遍历的过程中不断有元素入队
此时开始遍历q2的元素,q2的元素遍历完了,在遍历的同时q1也有元素不断入队
直到q1和q2中都为空队时,说明把整个树遍历完了,此时返回大vector。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
vector<int> cur;
if (!root)
return ans;
queue<TreeNode*> q1,q2;
q1.push(root);
while(!q1.empty()||!q2.empty())
{
while(!q1.empty())
{
auto node = q1.front();
q1.pop();
cur.push_back(node->val);
if(node->left) //如果左结点不为空
q2.push(node->left);
if(node->right) //如果右节点不为空
q2.push(node->right);
if(q1.size()==0)
{
ans.push_back(cur);
cur.clear();
}
}
while(!q2.empty())
{
auto node = q2.front();
q2.pop();
cur.push_back(node->val);
if(node->left)
q1.push(node->left);
if(node->right)
q1.push(node->right);
if(q2.size()==0)
{
ans.push_back(cur);
cur.clear();
}
}
}
return ans;
}
};
官方题解:
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector <vector <int>> ret;
if (!root) {
return ret;
}
queue <TreeNode*> q;
q.push(root);
while (!q.empty()) {
int currentLevelSize = q.size();
ret.push_back(vector <int> ());
for (int i = 1; i <= currentLevelSize; ++i) {
auto node = q.front(); q.pop();
ret.back().push_back(node->val);
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
}
return ret;
}
};
官方只用到了一个队列,节省了内存空间
不同于利用两个队列判断该元素是属于哪一层的:
官方题解是在每次进入while循环时先将此时队列中的元素个数保存下来 (int currentLevelSize = q.size()),再进行一个for循环(循环currentLevelSize)次,这样一来,便可以将每层的元素划分开。(妙啊~~)
附加 二叉树的四种遍历方法:
//该页前中后序遍历都是应用递归方法
void InorderTraversal( BinTree BT )
{
if( BT ) {
InorderTraversal( BT->Left );
/* 此处假设对BT结点的访问就是打印数据 */
printf("%d ", BT->Data); /* 假设数据为整型 */
InorderTraversal( BT->Right );
}
}
void PreorderTraversal( BinTree BT )
{
if( BT ) {
printf("%d ", BT->Data );
PreorderTraversal( BT->Left );
PreorderTraversal( BT->Right );
}
}
void PostorderTraversal( BinTree BT )
{
if( BT ) {
PostorderTraversal( BT->Left );
PostorderTraversal( BT->Right );
printf("%d ", BT->Data);
}
}
void LevelorderTraversal ( BinTree BT )
{
Queue Q;
BinTree T;
if ( !BT ) return; /* 若是空树则直接返回 */
Q = CreatQueue(); /* 创建空队列Q */
AddQ( Q, BT );
while ( !IsEmpty(Q) ) {
T = DeleteQ( Q );
printf("%d ", T->Data); /* 访问取出队列的结点 */
if ( T->Left ) AddQ( Q, T->Left );
if ( T->Right ) AddQ( Q, T->Right );
}
}