当前位置:   article > 正文

使用c++回旋打印二叉树的节点

使用c++回旋打印二叉树的节点

设计一个算法来回旋打印二叉树的节点。这个算法的基本思想是使用层序遍历(广度优先搜索)来访问树的节点,但是在打印时交替改变方向。下面是用C++实现的代码

  1. #include <iostream>
  2. #include <queue>
  3. #include <vector>
  4. #include <algorithm>
  5. // 定义二叉树节点结构
  6. struct TreeNode {
  7. int val;
  8. TreeNode *left;
  9. TreeNode *right;
  10. TreeNode(int x) : val(x), left(NULL), right(NULL) {}
  11. };
  12. // 回旋打印二叉树的函数
  13. void spiralOrder(TreeNode* root) {
  14. if (root == NULL) return; // 如果树为空,直接返回
  15. std::queue<TreeNode*> q; // 用于层序遍历的队列
  16. q.push(root); // 将根节点入队
  17. bool leftToRight = true; // 控制打印方向的标志
  18. while (!q.empty()) { // 当队列不为空时继续遍历
  19. int size = q.size(); // 当前层的节点数
  20. std::vector<int> level(size); // 存储当前层的节点值
  21. for (int i = 0; i < size; i++) {
  22. TreeNode* node = q.front(); // 获取队首节点
  23. q.pop(); // 将节点出队
  24. // 根据打印方向决定节点在level中的位置
  25. int index = leftToRight ? i : (size - 1 - i);
  26. level[index] = node->val;
  27. // 将子节点入队
  28. if (node->left) q.push(node->left);
  29. if (node->right) q.push(node->right);
  30. }
  31. // 打印当前层的节点
  32. for (int val : level) {
  33. std::cout << val << " ";
  34. }
  35. leftToRight = !leftToRight; // 改变下一层的打印方向
  36. }
  37. }
  38. // 主函数
  39. int main() {
  40. // 创建一个示例二叉树
  41. TreeNode* root = new TreeNode(1);
  42. root->left = new TreeNode(2);
  43. root->right = new TreeNode(3);
  44. root->left->left = new TreeNode(4);
  45. root->left->right = new TreeNode(5);
  46. root->right->left = new TreeNode(6);
  47. root->right->right = new TreeNode(7);
  48. std::cout << "回旋打印二叉树的结果:" << std::endl;
  49. spiralOrder(root);
  50. return 0;
  51. }

这个算法的工作原理如下:

  1. 使用队列进行层序遍历(广度优先搜索)。
  2. 用一个布尔变量 leftToRight 来控制每一层的打印方向。
  3. 对于每一层:
    • 创建一个向量 level 来存储当前层的节点值。
    • 遍历当前层的所有节点:
      • 如果是从左到右打印,按正常顺序存储到 level
      • 如果是从右到左打印,按相反顺序存储到 level
    • 将节点的子节点加入队列,为下一层做准备。
    • 打印 level 中的所有值。
    • 翻转 leftToRight 的值,为下一层改变方向。
  4. 重复这个过程,直到队列为空。

这个算法的时间复杂度是 O(n),其中 n 是树中节点的数量,因为每个节点都被访问一次。空间复杂度也是 O(n),主要是由队列和存储每一层节点的向量所占用的空间决定的。

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号