剑指offer之先序非递归打印二叉树
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之先序非递归打印二叉树相关推荐
- 剑指 Offer 32 . 从上到下打印二叉树
main函数测试代码: 按标准输入输出,比如输入: 3,9,20,null,null,15,7 public static void main(String[] args) {//输入3,9,20,n ...
- 剑指offer 32. 从上到下打印二叉树
声明:本系列博客是对何海涛<剑指offer>的关键点总结. 1.不分行从上到下打印二叉树 1.1. 问题描述 从上到下打印出二叉树的每一个结点,同一层的结点按照从左到右的顺序打印. 如二叉 ...
- 《剑指offer》-- 从上往下打印二叉树、二叉搜素树的后序遍历、二叉树中和为某一值的路径、二叉树与双向链表
一.从上往下打印二叉树: 1.题目: 上往下打印出二叉树的每个节点,同层节点从左至右打印. 2.解题思路: 用arraylist模拟一个队列来存储相应的TreeNode. 3.代码实现: public ...
- 【LeetCode笔记】剑指 Offer 55 - II. 平衡二叉树(递归、二叉树)
文章目录 题目描述 思路 && 代码 二刷 一脸懵逼,居然没写这道题的题解.. 题目描述 思路 && 代码 思路:平衡二叉树判断公式 = 左子树满足 + 右子树满足 + ...
- 剑指offer之从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印. 例如: 给定二叉树: [3,9,20,null,null,15,7], 返回: [3,9,20,15,7] 来源:力扣(LeetC ...
- [剑指Offer] 59.按之字形顺序打印二叉树
题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. [思路]先按层次遍历存入,通过设立标志位,将 ...
- 剑指offer:从上往下打印二叉树
文章目录 分析 来源 分析 思路 典型的bfs模板题,这里使用STL中的queue,没用数组模拟队列. STL的思路:初始化队列时,根root入队:对于bfs主体过程while循环内,取队头元素,队头 ...
- 《剑指offer》从上往下打印二叉树
题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解析:此题利用队列可以很好的解决层次打印,只需要按顺序入队以及出队就可以了(一点说明:root为null的时候需要考虑,java中的队列是 ...
- 剑指offer——32.从上到下打印二叉树
题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 知识点: 像这种不是按照指针顺序打印的都需要引入辅助空间,由于分析可知,先进先出,因此我们引入了两端都可进出的队列deque,常用操作, ...
最新文章
- 【SICP练习】94 练习2.67
- google reader很有用的技巧 F+F11
- Intent Bundle页面跳转信息的传递
- python画二维图_使用python绘制二维图形示例
- IIS Express局域网访问配置
- win10基于anaconda下的tensorflow2.0.0及cuda10.0、cudnn安装成功
- [整理]苹果审核被拒后,返回崩溃日志应该怎么分析处理
- 内网群PING的shell
- TMDB电影数据分析报告
- word pdf 互转
- linux 独立冗余磁盘阵列,独立冗余磁盘列阵
- numpy学习线性回归, 并用matplotlib画动态图
- 用计算机弹抖音上最火的纯音乐,抖音十大最火歌曲排名,包含几首超燃bgm纯音乐...
- 大数据到底应该如何学?
- 降噪蓝牙耳机哪个品牌好?降噪蓝牙耳机排行推荐
- 推荐一些实用的谷歌浏览器翻译插件
- 用计算机名ping得ip,PING命令取得计算机名和IP
- 用C++语言写游戏——打怪小游戏
- JSPX使用的几点注意
- Developpeur Reference对Bjarne Stroustrup的采访(转载)
热门文章
- C# 中如何一次 catch 多个异常?
- 迎接.NET 6,《dotnet+Linux中文手册》完整PDF开放下载!
- Asp.NET Core 中如何加密 Configuration ?
- VS2005~VS2022,那些年用过的VS,致敬,青春!
- WPF 如何实现颜色值拾取
- OneOfT1,…,Tn清新
- .NET Core 和 .NET Framework 启动可执行文件的差别
- 巧用lock解决缓存击穿的解决方案
- ASP.NET Core 消息传递:MediatR
- Asp.Net Core Filter 深入浅出的那些事-AOP