直接看代码:
#include<iostream>
#include<string>
#include<queue>
using namespace std;
//代码简单易懂
class Node{
public:
char data;
Node* left;
Node* right;
Node(char ch){
data=ch;
left=nullptr;
right=nullptr;
}
void setLeft(Node* left){
this->left=left;
}
void setRight(Node* right){
this->right=right;
}
};
class Tree{
Node* root;
int pos;
string strTree;
public:
void create(string s){
pos=0;
strTree=s;
root=createTree();
}
Node* createTree(){
Node* t;
char ch=strTree.at(pos++);
if(ch=='0'){
t=nullptr;
}else{
t=new Node(ch);
t->setLeft(createTree());
t->setRight(createTree());
}
return t;
}
void levelOrderShow(){
levelOrder(root);
}
void levelOrder(Node* t){
queue<Node*> q;
q.emplace(t);
while(!q.empty()){
Node* node=q.front();
q.pop();
if(node->left!=nullptr){
q.emplace(node->left);
}
if(node->right!=nullptr){
q.emplace(node->right);
}
cout<<node->data;
}
}
};
//力扣上的一道题,在层序遍历的时候区别出是那一层的,本代码中并没有调用该方法
class Solution {
public:
vector<vector<int>> levelOrder(Node* root) {
vector<vector<int>> result;
if (!root) {
return result;
}
vector<int> level;
queue<Node*> q;
//先放入初始的根节点和第一个隔板
q.emplace(root);
Node* board=new Node(0);
q.emplace(board);
//常规做法
while(!q.empty()){
Node* tmp=q.front();
q.pop();
if(tmp==board){
result.emplace_back(level);
level.clear();
//一定要是队列不为空的时候插入隔板
if(!q.empty())
q.emplace(tmp);
}else{
level.emplace_back(tmp->data);
if(tmp->left!=nullptr)
q.emplace(tmp->left);
if(tmp->right!=nullptr)
q.emplace(tmp->right);
}
}
//翻转这里要注意一下,我要用reverse就必须定义出迭代器
//vector<vector<int>>::iterator it=result.begin();
//vector<vector<int>>::iterator itt=result.end();
//reverse(it,itt);
return result;
}
};
int main(){
int t;
cin>>t;
while(t--){
string s;
cin>>s;
Tree* tree=new Tree();
tree->create(s);
tree->levelOrderShow();
cout<<endl;
}
return 0;
}
我是花花,祝自己也祝您变强了~