二叉树读入与输出(注意cin最后一个值的判断)

9 20 11 -1 -1 15 16


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

你可能感兴趣的:(c++,算法,数据结构)