二叉树的层序遍历

二叉树的层序遍历

一、题目

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)

但是有一个条件,每一层输出一行。

Leetcode:https://leetcode.cn/problems/binary-tree-level-order-traversal/

二、思路

一般的层序遍历比较简单,只需要使用一个队列,但是现在加上一个条件,即每一层按行打印。因此我们就需要知道每一行的最右边的节点,然后做换行操作。那么如何得知每一行最右边的节点呢?首先我们知道 root 节点,即根节点为第一层的最右节点。使用两个变量,一个记录当前层的最右节点,记为 last;另一个记录下一层的最右节点,记为 nlast。而我们在遍历每个节点时,都去判断当前节点是否为当前层的最右节点即可。如果已经遍历到当前层的最右节点了,那么下一层的最右节点其实也已经被赋值了。此时将下一层的最右节点 nlast 赋给 last 即可。

三、code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;

explicit TreeNode(int val) : val(val), left(nullptr), right(nullptr) {}
};

void level_recur(TreeNode* root) {
if (root == nullptr) {
return;
}
TreeNode* last = root;
TreeNode* nlast = nullptr;
std::queue<TreeNode*> qu;
qu.push(root);
int count = 1;
std::cout << "level " << count << ": ";
while (!qu.empty()) {
TreeNode* node = qu.front();
qu.pop();
std::cout << node->val << " ";
if (node->left) {
qu.push(node->left);
nlast = node->left;
}
if (node->right) {
qu.push(node->right);
nlast = node->right;
}
if (node == last && !qu.empty()) {
std::cout << std::endl << "level " << count++ << ": ";
last = nlast;
}
}
std::cout << std::endl;
}