__2.3 按层遍历二叉树

#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;
}

猜你喜欢

转载自blog.csdn.net/qq_40843865/article/details/89221711
2.3
今日推荐