# 二叉树的遍历与创建【先序,中序,后序,层序】

一、引言

二叉树作为一种重要的数据结构,在计算机科学的众多领域都有着广泛的应用。对二叉树的遍历和创建操作是处理二叉树的基础。本文将通过一段 C++ 代码,详细解析二叉树的先序、中序、后序遍历以及创建的实现过程。

二、代码整体结构

  1. 数据结构定义:定义了二叉树节点结构 binode 和两个辅助队列结构 lstquqq
  2. 队列操作函数:包括初始化队列 initq、判断队列是否为空 empty、入队 push 和出队 front
  3. 二叉树遍历函数:先序遍历(借助队列实现)cxbl,以及递归实现的先序 prbl、中序 inbl、后序 postbl 遍历。
  4. 二叉树创建函数creatree 用于递归创建二叉树。

三、数据结构定义

  1. 二叉树节点结构 binode
typedef struct node {
    int date;
    struct node* lc, * rc;
}binode, * bitree;

这里定义了二叉树的节点,每个节点包含一个整数值 date 用于存储数据,以及两个指针 lcrc 分别指向左孩子和右孩子节点。

  1. 队列节点结构 lstqu 和队列结构 qq
typedef struct node1 {
    bitree date;
    struct node1* next;
}lstqu;

typedef struct node2 {
    lstqu *front, *rear;
}qq;

lstqu 是队列的节点结构,其中 date 存放二叉树节点指针,next 指向下一个队列节点。qq 定义了队列,包含队头指针 front 和队尾指针 rear

四、队列操作函数

  1. 初始化队列 initq
void initq(qq* Q) {
    Q->front = Q->rear = (lstqu*)malloc(sizeof(lstqu));
    Q->front->next = NULL;
}

此函数为队列分配内存并初始化队头和队尾指针,使其指向同一个空节点,并将该节点的 next 设为 NULL

  1. 判断队列是否为空 empty
int empty(qq* Q) { 
    if (Q->rear == Q->front)
        return 1;
    else
        return 0;
}

通过比较队头和队尾指针是否相等来判断队列是否为空。

  1. 入队操作 push
void push(qq* Q, bitree root) {
    lstqu* q = (lstqu*)malloc(sizeof(lstqu));
    q->date = root;
    q->next = NULL;
    Q->rear->next = q;
    Q->rear = q;
}

为新节点分配内存,将传入的二叉树节点指针存入新节点,然后将新节点加入队尾。

  1. 出队操作 front
void front(qq* Q, bitree *root) {
    lstqu* q = Q->front->next;
    *root = q->date;
    Q->front->next = q->next;
    if (q->next == NULL) Q->rear = Q->front;
    free(q);
}

取出队头节点的数据(即二叉树节点指针),调整队头指针,若此时队列为空则更新队尾指针,最后释放队头节点的内存。

五、二叉树遍历函数

  1. 先序遍历(借助队列实现)cxbl
void cxbl(bitree boot) {
    qq* Q;
    initq(Q);
    bitree p;
    push(Q, boot);
    while (!empty(Q)) {
        front(Q, &p);
        cout << p->date << " ";
        if (p->lc!= NULL) push(Q, p->lc);
        if (p->rc!= NULL) push(Q, p->rc);
    }
}

先初始化队列并将根节点入队,然后不断从队列中取出节点,输出其数据,再将其左右孩子节点(若存在)入队,以此实现先序遍历。

  1. 递归先序遍历 prbl
void prbl(bitree root) {
    if (root == NULL) return;
    cout << root->date << endl;
    prbl(root->lc);
    prbl(root->rc);
}

若节点不为空,先输出节点数据,然后递归遍历左子树和右子树,实现先序遍历。

  1. 中序遍历 inbl
void inbl(bitree root) {
    if (root == NULL) return;
    prbl(root->lc);
    cout << root->date << endl;
    prbl(root->rc);
}

先递归遍历左子树,然后输出节点数据,最后递归遍历右子树,实现中序遍历。

  1. 后序遍历 postbl
void postbl(bitree root) {
    if (root == NULL) return;
    prbl(root->lc);
    prbl(root->rc);
    cout << root->date << endl;
}

先递归遍历左子树和右子树,最后输出节点数据,实现后序遍历。

六、二叉树创建函数 creatree

bitree creatree() {
    bitree t;
    int x;
    cin >> x;
    if (x == 0) t = NULL;
    else {
        t = (bitree)malloc(sizeof(bitree));
        t->date = x;
        t->lc = creatree();
        t->rc = creatree();
    }
    return t;
}

八、总结

通过对这段代码的详细解析,我们深入了解了二叉树的遍历和创建在 C++ 中的实现方法。递归遍历方式简洁明了,而借助队列实现的先序遍历则展示了不同的数据处理思路。这些操作是进一步学习二叉树相关算法和应用的重要基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值