key
- 按层序遍历顺序读入字符串,‘#’表示NULL结点
- 维持一个先进先出的队列
C++代码实现
#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;
}