#include "pch.h"
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
typedef char TElenType; //数据类型
typedef struct BiTNode {
public:
BiTNode(TElenType ch) : data(ch), lchild(nullptr), rchild(nullptr) { }
TElenType data;
struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;
//先序创建二叉树
void CreateBiTree(BiTree& T)
{
TElenType ch;
std::cin >> ch;
if (ch == '#')
T = nullptr;
else {
T = new BiTNode(ch);
if (!T)
exit(OVERFLOW);
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
//先序遍历二叉树
void PreOrderTraverse(const BiTree& T)
{
if (T == nullptr)
return;
std::cout << T->data << " ";
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
/*按层遍历二叉树,返回遍历后的结果*/
vector<vector<TElenType>> levelOrder(const BiTree& root)
{
vector<vector<TElenType>> result; //用于记录结果,每一行代表一层
deque<BiTNode*> myDeque;
if (!root)
return result;
myDeque.push_back(root);
myDeque.push_back(nullptr); //层与层之间用nullptr分隔,在队列中没遇到一个nullptr就表示当前层已遍历完成
vector<TElenType> it; //临时变量,记录某一行数据
while (!myDeque.empty()) {
auto p = myDeque.front();
myDeque.pop_front();
if (p) {
it.push_back(p->data); //将当前节点的数据压入结果容器
if (p->lchild != nullptr)
myDeque.push_back(p->lchild); //将下一层的非空节点压入队列等待处理
if (p->rchild != nullptr)
myDeque.push_back(p->rchild);
}
else if(p == nullptr) { //遇上分隔符,当前层遍历完成
if (!it.empty()) {
result.push_back(it); //将临时容器中当前层的结果保存起来
it.clear(); //清空临时容器,继续保存下一层的结果
myDeque.push_back(nullptr); //即将处理下一层,压入下一层与下下层的分隔标志
}
}
}
return result;
}
int main() {
BiTree BT;
std::cout << "请以先序输入二叉树节点:";
CreateBiTree(BT);
std::cout << "\n先序遍历二叉树结果为:";
PreOrderTraverse(BT);
std::cout << "\n\n按层遍历二叉树结果为:\n";
vector<vector<TElenType>> vec = levelOrder(BT);
for (auto v : vec) {
for (auto data : v)
cout << data << " ";
cout << endl;
}
return 0;
}
__2.3 按层遍历二叉树
猜你喜欢
转载自blog.csdn.net/qq_40843865/article/details/89221711
今日推荐
周排行