1 问题

先序非递归打印二叉树

比如二叉树如下

     *                  2*            3            5           *         1     4      2      3       *      3    2 1   5  1   4  2   3  

先序原则:中左右打印节点,如果左边有节点继续要打做节点,打印会是如下结果

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

2 分析

我们可以用stack,先进后出,我们先push头结点,然后再push它的右节点和左节点,依次类推

3 代码实现

#include <iostream>
#include <stack>using namespace std;typedef struct Node
{int value;struct Node* left;struct Node* right;
} Node;void start_print(Node *head)
{if (head == NULL){std::cout << "head is NULL" << std::endl;return;}std::stack<Node *> stack;stack.push(head);while (stack.size()){Node *node = stack.top();std::cout << node->value << std::endl;//do not remember pop nodestack.pop();if (node->right){stack.push(node->right);}if (node->left){stack.push(node->left);}}
}int main()
{/*                  2*            3            5           *         1     4      2      3       *      3    2 1   5  1   4  2   3   */Node head1, node1, node2, node3, node4, node5, node6;Node node7, node8, node9, node10, node11, node12, node13, node14;head1.value = 2;node1.value = 3;node2.value = 5;node3.value = 1;node4.value = 4;node5.value = 2;node6.value = 3;node7.value = 3;node8.value = 2;node9.value = 1;node10.value = 5;node11.value = 1;node12.value = 4;node13.value = 2;node14.value = 3;head1.left = &node1;head1.right = &node2;node1.left = &node3;node1.right = &node4;node2.left = &node5;node2.right = &node6;node3.left = &node7;node3.right = &node8;node4.left = &node9;node4.right = &node10;node5.left = &node11;node5.right = &node12;node6.left = &node13;node6.right = &node14;node7.left = NULL;node7.right = NULL;node8.left = NULL;node8.right =  NULL;node9.left = NULL;node9.right = NULL;node10.left = NULL;node10.right = NULL;node11.left = NULL;node11.right = NULL;node12.left = NULL;node12.right = NULL;node13.left = NULL;node13.right = NULL;node14.left = NULL;node14.right = NULL;start_print(&head1);return 0;
}

4 运行结果

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

5 总结

void start_print(Node *head)
{if (head == NULL){std::cout << "head is NULL" << std::endl;return;}std::stack<Node *> stack;stack.push(head);while (stack.size()){Node *node = stack.top();std::cout << node->value << std::endl;if (node->right){stack.push(node->right);}if (node->left){stack.push(node->left);}//do not remember pop nodestack.pop();}
}

一开始我出现了2个问题

问题1:没有调用stack.pop()函数,导致死循环。

问题2:我把那个stack.pop()写出上面的那个位置,很明显这里是栈,如果node->right或者node->left加到栈里面去了,这个时候再弹出来肯定不是我想要的效果,受之前使用queue的影响,因为pop()函数放哪里都行,想下如果是queue的话,因为是先进先出,所以如果node->right或者node->left加到队列里面去了,再pop()依然是弹出的最顶上的位置,所以不受位置限制。

小结:要记得使用pop()函数弹出来,然后stack调用pop()函数有位置限制,但是queue没有限制。

剑指offer之先序非递归打印二叉树相关推荐

  1. 剑指 Offer 32 . 从上到下打印二叉树

    main函数测试代码: 按标准输入输出,比如输入: 3,9,20,null,null,15,7 public static void main(String[] args) {//输入3,9,20,n ...

  2. 剑指offer 32. 从上到下打印二叉树

    声明:本系列博客是对何海涛<剑指offer>的关键点总结. 1.不分行从上到下打印二叉树 1.1. 问题描述 从上到下打印出二叉树的每一个结点,同一层的结点按照从左到右的顺序打印. 如二叉 ...

  3. 《剑指offer》-- 从上往下打印二叉树、二叉搜素树的后序遍历、二叉树中和为某一值的路径、二叉树与双向链表

    一.从上往下打印二叉树: 1.题目: 上往下打印出二叉树的每个节点,同层节点从左至右打印. 2.解题思路: 用arraylist模拟一个队列来存储相应的TreeNode. 3.代码实现: public ...

  4. 【LeetCode笔记】剑指 Offer 55 - II. 平衡二叉树(递归、二叉树)

    文章目录 题目描述 思路 && 代码 二刷 一脸懵逼,居然没写这道题的题解.. 题目描述 思路 && 代码 思路:平衡二叉树判断公式 = 左子树满足 + 右子树满足 + ...

  5. 剑指offer之从上到下打印二叉树

    从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7], 返回: [3,9,20,15,7] 来源:力扣(LeetC ...

  6. [剑指Offer] 59.按之字形顺序打印二叉树

    题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. [思路]先按层次遍历存入,通过设立标志位,将 ...

  7. 剑指offer:从上往下打印二叉树

    文章目录 分析 来源 分析 思路 典型的bfs模板题,这里使用STL中的queue,没用数组模拟队列. STL的思路:初始化队列时,根root入队:对于bfs主体过程while循环内,取队头元素,队头 ...

  8. 《剑指offer》从上往下打印二叉树

    题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解析:此题利用队列可以很好的解决层次打印,只需要按顺序入队以及出队就可以了(一点说明:root为null的时候需要考虑,java中的队列是 ...

  9. 剑指offer——32.从上到下打印二叉树

    题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 知识点: 像这种不是按照指针顺序打印的都需要引入辅助空间,由于分析可知,先进先出,因此我们引入了两端都可进出的队列deque,常用操作, ...

最新文章

  1. 【SICP练习】94 练习2.67
  2. google reader很有用的技巧 F+F11
  3. Intent Bundle页面跳转信息的传递
  4. python画二维图_使用python绘制二维图形示例
  5. IIS Express局域网访问配置
  6. win10基于anaconda下的tensorflow2.0.0及cuda10.0、cudnn安装成功
  7. [整理]苹果审核被拒后,返回崩溃日志应该怎么分析处理
  8. 内网群PING的shell
  9. TMDB电影数据分析报告
  10. word pdf 互转
  11. linux 独立冗余磁盘阵列,独立冗余磁盘列阵
  12. numpy学习线性回归, 并用matplotlib画动态图
  13. 用计算机弹抖音上最火的纯音乐,抖音十大最火歌曲排名,包含几首超燃bgm纯音乐...
  14. 大数据到底应该如何学?
  15. 降噪蓝牙耳机哪个品牌好?降噪蓝牙耳机排行推荐
  16. 推荐一些实用的谷歌浏览器翻译插件
  17. 用计算机名ping得ip,PING命令取得计算机名和IP
  18. 用C++语言写游戏——打怪小游戏
  19. JSPX使用的几点注意
  20. Developpeur Reference对Bjarne Stroustrup的采访(转载)

热门文章

  1. C# 中如何一次 catch 多个异常?
  2. 迎接.NET 6,《dotnet+Linux中文手册》完整PDF开放下载!
  3. Asp.NET Core 中如何加密 Configuration ?
  4. VS2005~VS2022,那些年用过的VS,致敬,青春!
  5. WPF 如何实现颜色值拾取
  6. OneOfT1,…,Tn清新
  7. .NET Core 和 .NET Framework 启动可执行文件的差别
  8. 巧用lock解决缓存击穿的解决方案
  9. ASP.NET Core 消息传递:MediatR
  10. Asp.Net Core Filter 深入浅出的那些事-AOP