分层遍历的思路:
二叉树分层遍历用到的是BFS(广度优先搜索),显然这必须维护一个队列。但是一个队列只能得到遍历结果,并不能一层一层分开,所以必须使用两个队列curr和next,curr保存当前层的所有结点指针,next保存下一层的结点指针,遍历的过程就是出队列的过程,在对curr出队列的同时将推出来的结点的非空左右子结点压入队列next,直到为空那么当前层遍历完毕,同时下一层的所有结点指针也保存完备了。
最大/小深度:
二叉树分层遍历用到的是BFS(广度优先搜索),显然这必须维护一个队列。但是一个队列只能得到遍历结果,并不能一层一层分开,所以必须使用两个队列curr和next,curr保存当前层的所有结点指针,next保存下一层的结点指针,遍历的过程就是出队列的过程,在对curr出队列的同时将推出来的结点的非空左右子结点压入队列next,直到为空那么当前层遍历完毕,同时下一层的所有结点指针也保存完备了。
最大/小深度:
当出队列操作完成,也就是一层遍历完成,这时候可以记录层数,因此可以通过记录切换的次数得到二叉树的深度。
int levelOrder(TreeNode *root) {
if (root == nullptr) return 0;
queue<TreeNode*> q1, q2;//用来切换的两个队列
q1.push(root);
TreeNode *curr = nullptr;
int count = 0;
while (!q1.empty() || !q2.empty()) {
if (!q1.empty()) ++count;
while (!q1.empty()) {
curr = q1.front();//打印
q1.pop();
if (curr->left != nullptr) {
q2.push(curr->left);
}
if (curr->right != nullptr) {
q2.push(curr->right);
}
/*
if (curr->left == nullptr && curr->right == nullptr) {//遇到叶子结点就停止遍历,返回层数(最小深度)
return count;
}*/
}
if (!q2.empty()) ++count;
while (!q2.empty()) {
curr = q2.front();//打印
q2.pop();
if (curr->left != nullptr) {
q1.push(curr->left);
}
if (curr->right != nullptr) {
q1.push(curr->right);
}
/*
if (curr->left == nullptr && curr->right == nullptr) { //返回最小深度
return count;
}
*/
}
}
return count; //返回最大深度
}