key
- 按层序遍历顺序读入字符串,'#'表示NULL结点
- 维持一个先进先出的队列
C++代码实现
cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <queue>
using namespace std;
struct TreeNode {
char data;
TreeNode* left;
TreeNode* right;
};
struct QueueNode {
TreeNode* parent;//记录父节点
bool isLeft;//记录父节点左孩子是否插入过
};
void LevelOrder(TreeNode* proot) {
queue<TreeNode*> pos;
pos.push(proot);
while (pos.empty() == false) {
TreeNode* pCur = pos.front();
pos.pop();
printf("%c", pCur->data);
if (pCur->left != NULL) {
pos.push(pCur->left);
}
if (pCur->right != NULL) {
pos.push(pCur->right);
}
}
}
//可能修改根节点的指向,所以参数必须传根节点指针的引用
void BuildTree(TreeNode* &proot, queue<QueueNode*>& pos, char data) {
if (data != '#') {
//申请一个树结点
TreeNode* pNew = new TreeNode();
pNew->data = data;
//申请一个队列结点
QueueNode* pQueueNode = new QueueNode();
pQueueNode->parent = pNew;//在队列结点中保存刚创建的新结点位置
pQueueNode->isLeft = false;//表示新结点的左孩子还没有访问过
pos.push(pQueueNode);//新结点入队
if (proot == NULL) {
proot = pNew;
}
else {
QueueNode* pCur = pos.front();//获取队列队首
if (pCur->isLeft == false) {//看看队首的左孩子是否插入过
pCur->parent->left = pNew;
pCur->isLeft = true;
}
else {
pCur->parent->right = pNew;//左右孩子都插入了,就出队
pos.pop();
delete pCur;
}
}
}
else {//新加入结点是空结点
QueueNode* pCur = pos.front();
if (pCur->isLeft == false) {
pCur->parent->left = NULL;
pCur->isLeft = true;
}
else {
pCur->parent->right = NULL;
pos.pop();
delete pCur;
}
}
}
int main() {
TreeNode* proot = NULL;
char data;
queue<QueueNode*> pos;
while (1) {
scanf("%c", &data);
if (data == '\n') {//读到了一行的末尾
break;
}
BuildTree(proot, pos, data);
}
LevelOrder(proot);
return 0;
}