9 20 11 -1 -1 15 16
#include <iostream>
#include <queue>
using namespace std;
// 定义node结构体
struct node {
int data; // 节点的值
node* left; // 左子节点的指针
node* right; // 右子节点的指针
node(int x) : data(x), left(NULL), right(NULL) {} // 构造函数
};
// 根据一行的节点值创建二叉树,-1表示节点不存在
node* create_tree() {
queue<node*> q; // 创建一个队列用于辅助
int x; // 用于存储输入的值
cin >> x; // 输入第一个值
if (x == -1) return NULL; // 如果是-1,表示树为空,直接返回NULL
node* root = new node(x); // 否则,创建根节点
q.push(root); // 将根节点入队
while (!q.empty()) { // 当队列不为空时,循环执行以下操作
node* cur = q.front(); // 取出队头元素,作为当前节点
q.pop(); // 将队头元素出队
cin >> x; // 输入当前节点的左子节点的值
if (x != -1) { // 如果不是-1,表示左子节点存在
node* left = new node(x); // 创建左子节点
cur->left = left; // 将当前节点的左子指针指向左子节点
q.push(left); // 将左子节点入队
}
cin >> x; // 输入当前节点的右子节点的值
if (x != -1) { // 如果不是-1,表示右子节点存在
node* right = new node(x); // 创建右子节点
cur->right = right; // 将当前节点的右子指针指向右子节点
q.push(right); // 将右子节点入队
}
x = -1; //遍历结束的重要条件!!!!!!!!!!!!!!!!!!
}
return root; // 返回根节点指针
}
// 分层输出二叉树的函数
void print_tree(node* root) {
if (root == NULL) return; // 如果根节点为空,直接返回
queue<node*> q; // 创建一个队列用于辅助
q.push(root); // 将根节点入队
while (!q.empty()) { // 当队列不为空时,循环执行以下操作
int size = q.size(); // 获取当前层的节点个数
for (int i = 0; i < size; i++) { // 遍历当前层的每个节点
node* cur = q.front(); // 取出队头元素,作为当前节点
q.pop(); // 将队头元素出队
cout << cur->data << " "; // 输出当前节点的值
if (cur->left) q.push(cur->left); // 如果当前节点有左子节点,将其入队
if (cur->right) q.push(cur->right); // 如果当前节点有右子节点,将其入队
}
cout << endl; // 输出换行符,表示一层结束
}
}
// 主函数,测试代码
int main() {
freopen("test.txt", "r", stdin);
node* root = create_tree(); // 调用创建二叉树的函数,返回根节点指针
print_tree(root);
cout << "二叉树创建成功!" << endl;
return 0;
}