数据结构-二叉树层次遍历

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zwx19921215/article/details/83306952

首先介绍下二叉树的层次遍历即按照顺序对树节点依次访问,如下图:

顺序遍历的结果为:ABCDEFGHIJK

我们可以借助一个队列来实现二叉树的层次遍历;思路如下:

先将二叉树根节点入队,然后出队,访问该节点,如果有左子树,则将左子树根节点入队;如果有右子树,则将右子树根节点入队。然后出队,对出队节点访问,如此循环

直到队列为空。

代码实现:


//
// Created by Administrator on 2018/6/5.
//
/**
 * 层次遍历:通过辅助队列实现二叉树的层次遍历
 */
#include "stdio.h"
#include "stdlib.h"

/**
 * 定义一棵树
 */
typedef struct {
    char data;
    struct BitTreeNode *lchild, *rchild;
} BitTreeNode, *BitTree;

/**
 * 定义一个队列节点
 */
typedef struct {
    BitTree data;//节点元素
    struct QNode *next;//节点指向下一个节点的指针域
} QNode;

/**
 * 定义一个队列:链式队列
 */
typedef struct {
    //队列的头指针,尾指针:头指针始终指向头节点,尾指针随着元素入队向后移动
    // 如果队列为空则头指针=尾指针同时指向头节点
    QNode *front, *rear;
} LinkQueue;

/**
 * 前序法创建树
 * @param tree
 * @return
 */
BitTree createTree(BitTree tree) {
    char c;
    scanf("%c", &c);
    if (c == '#') {
        return 0;
    } else {
        tree = (BitTree) malloc(sizeof(BitTreeNode));
        tree->data = c;
        tree->lchild = createTree(tree->lchild);
        tree->rchild = createTree(tree->rchild);
    }
    return tree;
}

/**
 * 初始化队列
 * @param q
 */
void initQueue(LinkQueue *q) {
    q->front = q->rear = (QNode *) malloc(sizeof(QNode));
    q->front->next = NULL;
}

/**
 * 入队操作
 * @param q
 * @param tree
 */
void enQueue(LinkQueue *q, BitTree tree) {
    //开辟节点空间
    QNode *s = (QNode *) malloc(sizeof(QNode));
    //节点数据域赋值
    s->data = tree;
    //队列尾指针的指针域指向该节点
    q->rear->next = s;
    //队列尾指针移动到该节点
    q->rear = s;
}

/**
 * 出队操作
 * @param q
 * @return
 */
BitTree deQueue(LinkQueue *q) {
    //获取头结点的下一个节点
    QNode *s = q->front->next;
    //获取数据元素
    BitTree tree = s->data;
    //队列头指针的指针域指向出队节点的下一个节点
    q->front->next = s->next;
    if (s == q->rear) {
        //如果出队节点为队列尾指针,则说明该节点为队列的最后一个元素节点
        //将尾指针指向头指针(头指针指向了头结点)
        q->rear = q->front;
    }
    free(s);
    return tree;
}

void visit(char data) {
    printf("%c", data);
}

/**
 * 二叉树层次遍历
 * @param tree
 * @param queue
 */
void levelOrder(BitTree tree, LinkQueue queue) {
    initQueue(&queue);
    BitTree p;
    enQueue(&queue, tree);
    while (queue.front != queue.rear) {
        p = deQueue(&queue);
        visit(p->data);
        if (p->lchild != NULL) {
            enQueue(&queue, p->lchild);
        }
        if (p->rchild != NULL) {
            enQueue(&queue, p->rchild);
        }
    }
}

int main() {
    LinkQueue queue;
    BitTree tree;
    tree = createTree(tree);
    printf("层次遍历结果:\n");
    levelOrder(tree, queue);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zwx19921215/article/details/83306952