C++中通过递归随机创建二叉树及层序遍历打印示例

#include <iostream>
#include <cstdlib>
#include <ctime>

// 定义元素类型
typedef int element;

// 定义二叉树节点结构体
typedef struct btree {
    struct btree* lchild;  // 左子树指针
    struct btree* rchild;  // 右子树指针
    element data;  // 节点存储的数据
}*BTree, btree;

// 初始化二叉树(递归创建)
BTree iniBT1(int n) {
    BTree T;
    int m = 0;
    // 生成 0 到 9 的随机数
    m = rand() % 10;
    // 如果节点数小于等于 0 或者随机数为 0,返回空树
    if (n <= 0 || m == 0) {
        return NULL;
    }
    // 为新节点分配内存
    T = (BTree)malloc(sizeof(btree));
    T->data = m;
    // 递归创建左子树和右子树
    T->lchild = iniBT1(n - 1);
    T->rchild = iniBT1(n - 1);
    return T;
}

// 层序遍历二叉树并打印(带有特殊格式)
void levelOrderTraversal(BTree root) {
    if (root == NULL) {
        return;
    }

    // 创建一个队列,并将根节点入队
    BTree* queue = (BTree*)malloc(sizeof(btree) * 200);
    int front = 0;
    int rear = 0;
    queue[rear++] = root;
    BTree k = (BTree)malloc(sizeof(btree));
    k->data = -1;
    int flag = 1;
    while (flag) {
        flag = 0;
        int levelSize = rear - front;
        int space = 110 / (levelSize + 1);
        // 遍历当前层的节点
        for (int i = 0; i < levelSize; i++) {
            BTree current = queue[front++];
            // 根据节点数据和位置进行不同格式的打印
            if (current->data == -1) {
                printf("%*s", space, "");
            } else if (i % 2 == 0) {
                printf("%*s[%d", space, "", current->data);
            } else {
                printf("%*s%d]", space, "", current->data);
            }
            // 将当前节点的左右子节点入队(处理空节点情况)
            if (current->lchild && (current->lchild->data > -1)) {
                queue[rear++] = current->lchild;
                flag = 1;
            } else {
                queue[rear++] = k;
            }
            if (current->rchild && (current->rchild->data > -1)) {
                queue[rear++] = current->rchild;
                flag = 1;
            } else {
                queue[rear++] = k;
            }
        }
        printf("\n\n");
    }
    free(queue);
}

int main() {
    srand(static_cast<unsigned int>(time(nullptr)));
    // 假设已经创建了二叉树 root
    BTree root = iniBT1(5);
    levelOrderTraversal(root);
    return 0;
}

 levelOrderTraversal函数中的队列操作是层序遍历的关键,通过合理的内存管理和节点入队出队操作实现了遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值