剑指offer之分行从上到下之字行打印二叉树

举报
chenyu 发表于 2021/07/26 23:06:08 2021/07/26
【摘要】 1 问题 分行从上到下之字行打印二叉树 比如二叉树 2 3 5 1 4 2 3 3 2 1 5 1 4 2 3  分行从上到下之字行打印二叉树结果如下 25 31 4 2 33 2 4 1 5 1 2 3           2 分析 这里我们可以用2个栈(先进后出...

1 问题

分行从上到下之字行打印二叉树

比如二叉树


  
  1. 2
  2. 3 5
  3. 1 4 2 3
  4. 3 2 1 5 1 4 2 3

 分行从上到下之字行打印二叉树结果如下


  
  1. 2
  2. 5 3
  3. 1 4 2 3
  4. 3 2 4 1 5 1 2 3

 

 

 

 

 

2 分析

这里我们可以用2个栈(先进后出),先把stack1push根节点,然后把stack全部弹出来,分别push根节点的左节点和右节点到stack2,然后stack2弹出栈里面的每个节点,我们分别把每个节点的右节点和左节点push到stack1,里面去,直到stack1和stack2都是空元素结束循环。

 

 

 

 

 

 

3 代码实现


  
  1. #include <iostream>
  2. #include <stack>
  3. using namespace std;
  4. typedef struct Node
  5. {
  6. int value;
  7. struct Node* left;
  8. struct Node* right;
  9. } Node;
  10. void layer_print(Node *head)
  11. {
  12. if (head == NULL)
  13. {
  14. std::cout << "head is NULL" << std::endl;
  15. return;
  16. }
  17. std::stack<Node *> stack1, stack2;
  18. stack1.push(head);
  19. while((stack1.size() != 0) || (stack2.size() != 0))
  20. {
  21. while (stack1.size() != 0)
  22. {
  23. Node *node = stack1.top();
  24. std::cout << node->value << "\t";
  25. if (node->left)
  26. stack2.push(node->left);
  27. if (node->right)
  28. stack2.push(node->right);
  29. stack1.pop();
  30. }
  31. std::cout << std::endl;
  32. while (stack2.size() != 0)
  33. {
  34. Node *node = stack2.top();
  35. std::cout << node->value << "\t";
  36. if (node->right)
  37. stack1.push(node->right);
  38. if (node->left)
  39. stack1.push(node->left);
  40. stack2.pop();
  41. }
  42. std::cout << std::endl;
  43. }
  44. }
  45. int main()
  46. {
  47. /* 2
  48. * 3 5
  49. * 1 4 2 3
  50. * 3 2 1 5 1 4 2 3
  51. */
  52. Node head1, node1, node2, node3, node4, node5, node6;
  53. Node node7, node8, node9, node10, node11, node12, node13, node14;
  54. head1.value = 2;
  55. node1.value = 3;
  56. node2.value = 5;
  57. node3.value = 1;
  58. node4.value = 4;
  59. node5.value = 2;
  60. node6.value = 3;
  61. node7.value = 3;
  62. node8.value = 2;
  63. node9.value = 1;
  64. node10.value = 5;
  65. node11.value = 1;
  66. node12.value = 4;
  67. node13.value = 2;
  68. node14.value = 3;
  69. head1.left = &node1;
  70. head1.right = &node2;
  71. node1.left = &node3;
  72. node1.right = &node4;
  73. node2.left = &node5;
  74. node2.right = &node6;
  75. node3.left = &node7;
  76. node3.right = &node8;
  77. node4.left = &node9;
  78. node4.right = &node10;
  79. node5.left = &node11;
  80. node5.right = &node12;
  81. node6.left = &node13;
  82. node6.right = &node14;
  83. node7.left = NULL;
  84. node7.right = NULL;
  85. node8.left = NULL;
  86. node8.right = NULL;
  87. node9.left = NULL;
  88. node9.right = NULL;
  89. node10.left = NULL;
  90. node10.right = NULL;
  91. node11.left = NULL;
  92. node11.right = NULL;
  93. node12.left = NULL;
  94. node12.right = NULL;
  95. node13.left = NULL;
  96. node13.right = NULL;
  97. node14.left = NULL;
  98. node14.right = NULL;
  99. layer_print(&head1);
  100. return 0;
  101. }

 

 

 

 

4 运行结果


  
  1. 2
  2. 5 3
  3. 1 4 2 3
  4. 3 2 4 1 5 1 2 3

 

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/90323911

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。