102. 二叉树的层序遍历(C++题解版含VS可运行源码)
1.力扣C++源码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
if (!root)return {};
vector<int> temp;
vector<vector<int>> res;
queue<TreeNode*> store;
store.push(root);
int remaining = 1;
int nextlevel = 0;
while (!store.empty()) {
TreeNode* node = store.front();
store.pop();
remaining--;
temp.push_back(node->val);
if (node->left) {
store.push(node->left);
nextlevel++;
}
if (node->right) {
store.push(node->right);
nextlevel++;
}
if (!remaining) {
remaining = nextlevel;
nextlevel = 0;
res.push_back(temp);
temp.clear();
}
}
return res;
}
};
2.题解
- 先把root放进队列store中,用remaining记录本层节点的个数,用nextlevel记录下一层节点的个数。
- 进入while循环,假如store不空,那么取出队列store中一个节点,并且用node记录它,那么remaining- -,并把这个节点的值放进临时数组temp中去;
- 接下来看node有无左右节点,有的话放进队列store,并且下一层节点个数即nextlevel++;
- 假如remaining==0,说明这一层没有节点了,把temp放进结果数组res中,清空temp数组,remaining变成下一层节点的个数,nextlevel变为0。
3.VS可运行源码
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<vector>
#include<queue>
#include<limits>
#include<algorithm>
#pragma warning(disable:4996)
using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
void CreateBiTree(TreeNode** T)
{
int ch;
scanf("%d", &ch);
if (ch == -1)
*T = NULL;
else
{
*T = (TreeNode*)malloc(sizeof(TreeNode));
if (!*T)
exit(-1);
(*T)->val = ch;
CreateBiTree(&(*T)->left);
CreateBiTree(&(*T)->right);
}
}
//先把root放进队列store中,用remaining记录本层节点的个数,用nextlevel记录下一层节点的个数。
//进入while循环,假如store不空,那么取出队列store中一个节点,
//并且用node记录它,那么remaining–-,并把这个节点的值放进临时数组temp中去;
//接下来看node有无左右节点,有的话放进队列store,并且下一层节点个数即nextlevel++;
//假如remaining == 0,说明这一层没有节点了,把temp放进结果数组res中,
//清空temp数组,remaining变成下一层节点的个数,nextlevel变为0。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
/*if (!root)
return {};
vector<int> temp;
vector<vector<int>> res;
queue<TreeNode*> store;
store.push(root);
int remaining = 1;
int nextlevel = 0;
while (!store.empty()) {
TreeNode* node = store.front();
store.pop();
remaining--;
temp.push_back(node->val);
if (node->left) {
store.push(node->left);
nextlevel++;
}
if (node->right) {
store.push(node->right);
nextlevel++;
}
if (remaining == 0) {
res.push_back(temp);
temp.clear();
remaining = nextlevel;
nextlevel = 0;
}
}
return res;*/
//自己写一遍,思路很清晰
if (!root)return {};
vector<int> temp;
vector<vector<int>> res;
queue<TreeNode*> store;
store.push(root);
int remaining = 1;
int nextlevel = 0;
while (!store.empty()) {
TreeNode* node = store.front();
store.pop();
remaining--;
temp.push_back(node->val);
if (node->left) {
store.push(node->left);
nextlevel++;
}
if (node->right) {
store.push(node->right);
nextlevel++;
}
if (!remaining) {
remaining = nextlevel;
nextlevel = 0;
res.push_back(temp);
temp.clear();
}
}
return res;
}
};
int main()
{
printf("按先序遍历顺序输入二叉树(叶子节点的左右孩子节点均输入-1):\n");
TreeNode* T;
CreateBiTree(&T);//地址传递,传的是根节点指针的地址
Solution test;
vector<vector<int>> res = test.levelOrder(T);
for (int i = 0; i < res.size(); i++) {
for (int j = 0; j < res[i].size(); j++) {
printf("%d", res[i][j]);
}
printf("\n");
}
system("pause");
return 0;
}
4.二叉树的创建说明
我建立二叉树设定的是让叶子节点都为-1,
比如:
按先序遍历顺序输入二叉树
输入3 9 -1 -1 20 15 -1 -1 7 -1 -1敲回车即可