[数据结构]二叉树的层序遍历

一、二叉树的层序遍历

设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。

层序遍历比较特别,需要用到前面学过的队列知识.

[数据结构]队列-CSDN博客

我先来说一下我们的思路:

我们是这样完成的:

1.我们先创建一个队列:

2.然后让1入队列:

3.接着把1的左右子树入队列:

4.因为1的左右子树已经入队列了,此时打印1然后让1出队列:

5.然后让2(也就是一的左子树)的左右子树入队列:

6.因为2的左右子树已经入队列了,此时打印2然后让2出队列:

7.然后让3的左右子树入队列:

8.然后让3出队列:

9.后面子树为空就不入队列,依次打印元素,,在打印完最后一个元素时(这里是7),销毁队列.

接下来我们来完成这个思路,下面是代码实现:

1.我们先写一个二叉树的接口:


typedef struct TreeNode {
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
} TreeNode;

2.写一个队列的接口,以及相关操作:

typedef struct QueueNode {
    TreeNode* treenode;
    struct QueueNode* next;
} QueueNode;

typedef struct Queue {
    QueueNode* front;
    QueueNode* rear;
} Queue;

void initQueue(Queue* q) {
    q->front = q->rear = NULL;
}

int isEmpty(Queue* q) {
    return q->front == NULL;
}

void enqueue(Queue* q, TreeNode* treenode) {
    QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode));
    newNode->treenode = treenode;
    newNode->next = NULL;
    if (isEmpty(q)) {
        q->front = q->rear = newNode;
    }
    else {
        q->rear->next = newNode;
        q->rear = newNode;
    }
}

3.二叉树节点出队列:

TreeNode* dequeue(Queue* q) {
    if (isEmpty(q)) return NULL;
    QueueNode* temp = q->front;
    TreeNode* treenode = temp->treenode;
    q->front = q->front->next;
    if (q->front == NULL) {
        q->rear = NULL;
    }
    free(temp);
    return treenode;
}

4.层序遍历:

void levelOrderTraversal(TreeNode* root) {
    if (root == NULL) return;
    Queue q;
    initQueue(&q);
    enqueue(&q, root);
    while (!isEmpty(&q)) {
        TreeNode* current = dequeue(&q);
        printf("%d ", current->val);
        if (current->left != NULL) {
            enqueue(&q, current->left);
        }
        if (current->right != NULL) {
            enqueue(&q, current->right);
        }
    }
}

下面我们来简单的测试一下:

我们写一个简单的主函数,然后运行一下:

int main() {
    TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
    root->val = 1;
    root->left = (TreeNode*)malloc(sizeof(TreeNode));
    root->left->val = 2;
    root->left->left = (TreeNode*)malloc(sizeof(TreeNode));
    root->left->right = (TreeNode*)malloc(sizeof(TreeNode));
    root->right = (TreeNode*)malloc(sizeof(TreeNode));
    root->right->val = 3;
    root->right->left = (TreeNode*)malloc(sizeof(TreeNode));
    root->right->right = (TreeNode*)malloc(sizeof(TreeNode));
    root->left->left->val = 4;
    root->left->left->left = NULL;
    root->left->left->right = NULL;
    root->left->right->val = 5;
    root->left->right->left = NULL;
    root->left->right->right = NULL;
    root->right->left->val = 6;
    root->right->left->left = NULL;
    root->right->left->right = NULL;
    root->right->right->val = 7;
    root->right->right->left = NULL;
    root->right->right->right = NULL;
    levelOrderTraversal(root);

    return 0;
}

我们把上面的二叉树数据写入,如果是层序遍历,结果应该就是:1 2 3 4 5 6 7

运行结果:

结果正确.


大家也可结合上回的前序遍历来把数据写入二叉树,使这段代码更加有意思。本篇的内容到此就结束了,感谢阅读。

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-03-26 12:50:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-26 12:50:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-26 12:50:06       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-26 12:50:06       20 阅读

热门阅读

  1. 解析option设计模式

    2024-03-26 12:50:06       18 阅读
  2. 【设计模式】原型模式详解

    2024-03-26 12:50:06       18 阅读
  3. 富格林:正确析辨虚假受害陷阱

    2024-03-26 12:50:06       19 阅读
  4. 全面认识“服装ERP系统”,读这一篇就够了!

    2024-03-26 12:50:06       18 阅读
  5. kubernetes- ingress-gateway-istio_gateway的区别

    2024-03-26 12:50:06       15 阅读
  6. IOS面试题编程机制 26-30

    2024-03-26 12:50:06       15 阅读
  7. list转树形,亲测可用

    2024-03-26 12:50:06       22 阅读
  8. 【Docker】Airflow Scheduler 容器部署

    2024-03-26 12:50:06       18 阅读
  9. 如何系统地自学 Python?

    2024-03-26 12:50:06       18 阅读
  10. # 14 React 自定义Hook详解

    2024-03-26 12:50:06       18 阅读
  11. [python]tensorflow与keras对应关系表

    2024-03-26 12:50:06       19 阅读
  12. 爬虫第4课:get请求

    2024-03-26 12:50:06       18 阅读