当前位置:   article > 正文

c语言和c++实现层序遍历_c++ 层序遍历

c++ 层序遍历

层序遍历是一种二叉树的遍历方式,也称为广度优先遍历,它的遍历顺序是:从上到下,从左到右,一层一层地遍历整棵树。在 C 语言中,我们可以使用队列来实现层序遍历。

具体实现步骤如下:

  1. 将根节点入队列。
  2. 当队列不为空时,重复以下步骤:
    • 从队头弹出一个节点,访问该节点。
    • 如果该节点有左子树,则将左子树入队列。
    • 如果该节点有右子树,则将右子树入队列。

1.下面是使用队列实现层序遍历的 C 语言代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct Node {
  4. int val;
  5. struct Node* left;
  6. struct Node* right;
  7. };
  8. struct Node* createNode(int val) {
  9. struct Node* node = (struct Node*)malloc(sizeof(struct Node));
  10. node->val = val;
  11. node->left = NULL;
  12. node->right = NULL;
  13. return node;
  14. }
  15. void levelOrderTraversal(struct Node* root) {
  16. if (root == NULL) {
  17. return;
  18. }
  19. struct Node* queue[1000];
  20. int front = 0;
  21. int rear = 0;
  22. queue[rear++] = root;
  23. while (front < rear) {
  24. struct Node* node = queue[front++];
  25. printf("%d ", node->val);
  26. if (node->left != NULL) {
  27. queue[rear++] = node->left;
  28. }
  29. if (node->right != NULL) {
  30. queue[rear++] = node->right;
  31. }
  32. }
  33. }
  34. int main() {
  35. struct Node* root = createNode(1);
  36. root->left = createNode(2);
  37. root->right = createNode(3);
  38. root->left->left = createNode(4);
  39. root->left->right = createNode(5);
  40. root->right->left = createNode(6);
  41. root->right->right = createNode(7);
  42. levelOrderTraversal(root);
  43. return 0;
  44. }

在上面的代码中,我们首先定义了一个结构体 Node 来表示二叉树的节点,以及一个函数 createNode 来创建新的节点。然后,我们实现了 levelOrderTraversal 函数来实现层序遍历。在函数中,我们首先定义了一个队列和两个指针 frontrear,用于记录队头和队尾的位置。然后,将根节点入队列,进入循环。在循环中,我们首先从队头弹出一个节点,访问该节点,然后依次将其左子节点和右子节点入队列。循环结束后,我们完成了整棵树的层序遍历。

  1. struct Node* queue[1000];
  2. int front = 0;
  3. int rear = 0;
  4. queue[rear++] = root;
  5. while (front < rear) {
  6. struct Node* node = queue[front++];
  7. printf("%d ", node->val);
  8. if (node->left != NULL) {
  9. queue[rear++] = node->left;
  10. }
  11. if (node->right != NULL) {
  12. queue[rear++] = node->right;
  13. }
  14. }
  15. }

这段代码使用了一个数组 queue 来辅助进行二叉树的层序遍历,是一种不使用 C++ 标准库的实现方式。我们首先定义了一个 queue 数组,其大小为 1000,存储的元素是指向 Node 类型的指针。然后,定义了两个整数变量 frontrear 分别表示队首和队尾的下标。

接下来,我们将根节点指针 root 存储在 queue 数组的队尾,并将 rear 的值加一,表示入队操作完成。然后,进入一个循环,只要队列不为空,就一直执行循环。在循环内部,我们首先从队列中取出队首元素,即二叉树中当前层的最左边的节点,将其存储在名为 node指针变量中。然后,我们输出 node 的值,即该节点的 val 属性。

接下来,我们判断该节点的左右子节点是否存在,如果存在,就将它们的指针存储在 queue 数组的队尾,并将 rear 的值加一,表示入队操作完成。这样,队列中存储的元素就是下一层的所有节点。当当前层的所有节点都被取出并输出后,循环继续执行,取出队列中的下一个节点,重复上述步骤,直到遍历完整个二叉树。

这个算法的时间复杂度为 $O(n)$,其中 $n$ 是二叉树的节点数。因为我们需要遍历每个节点一次,而每个节点最多进队一次出队一次,所以队列的操作次数也是 $O(n)$ 级别的。

2.下面是使用队列实现层序遍历的 C++ 代码:

  1. #include <iostream>
  2. #include <queue>
  3. using namespace std;
  4. struct Node {
  5. int val;
  6. Node* left;
  7. Node* right;
  8. Node(int v) : val(v), left(nullptr), right(nullptr) {}
  9. };
  10. void levelOrderTraversal(Node* root) {
  11. if (root == nullptr) {
  12. return;
  13. }
  14. queue<Node*> q;
  15. q.push(root);
  16. while (!q.empty()) {
  17. Node* node = q.front();
  18. q.pop();
  19. cout << node->val << " ";
  20. if (node->left != nullptr) {
  21. q.push(node->left);
  22. }
  23. if (node->right != nullptr) {
  24. q.push(node->right);
  25. }
  26. }
  27. }
  28. int main() {
  29. Node* root = new Node(1);
  30. root->left = new Node(2);
  31. root->right = new Node(3);
  32. root->left->left = new Node(4);
  33. root->left->right = new Node(5);
  34. root->right->left = new Node(6);
  35. root->right->right = new Node(7);
  36. levelOrderTraversal(root);
  37. return 0;
  38. }

在上面的代码中,我们首先定义了一个结构体 Node 来表示二叉树的节点,并且在结构体中使用了构造函数来方便创建新的节点。然后,我们实现了 levelOrderTraversal 函数来实现层序遍历。在函数中,我们首先定义了一个队列 q,将根节点入队列,进入循环。在循环中,我们首先从队头弹出一个节点,访问该节点,然后依次将其左子节点和右子节点入队列。循环结束后,我们完成了整棵树的层序遍历。

  1. queue<Node*> q;
  2. q.push(root);
  3. while (!q.empty()) {
  4. Node* node = q.front();
  5. q.pop();
  6. cout << node->val << " ";
  7. if (node->left != nullptr) {
  8. q.push(node->left);
  9. }
  10. if (node->right != nullptr) {
  11. q.push(node->right);

这段代码使用了 C++ 的标准库中的 queue 来辅助进行二叉树的层序遍历。我们首先定义了一个名为 q 的队列,队列中存储的元素是指向 Node 类型的指针。然后,将根节点指针 root 压入队列中,表示从根节点开始遍历。

接下来,我们进入一个循环,只要队列不为空,就一直执行循环。在循环内部,我们首先从队列中取出队首元素,即二叉树中当前层的最左边的节点,将其存储在名为 node 的指针变量中。然后,我们输出 node 的值,即该节点的 val 属性。

接下来,我们判断该节点的左右子节点是否存在,如果存在,就将它们的指针压入队列中。这样,队列中存储的元素就是下一层的所有节点。当当前层的所有节点都被取出并输出后,循环继续执行,取出队列中的下一个节点,重复上述步骤,直到遍历完整个二叉树。

这个算法的时间复杂度为 $O(n)$,其中 $n$ 是二叉树的节点数。因为我们需要遍历每个节点一次,而每个节点最多进队一次出队一次,所以队列的操作次数也是 $O(n)$ 级别的。空间复杂度为 $O(w)$,其中 $w$ 是二叉树的最大宽度,也就是某一层节点数的最大值。因为我们需要使用队列来存储每一层的节点,所以空间复杂度取决于二叉树的最大宽度。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/515120
推荐阅读
相关标签
  

闽ICP备14008679号