声明:本系列博客是对何海涛《剑指offer》的关键点总结。

1.不分行从上到下打印二叉树

1.1. 问题描述

从上到下打印出二叉树的每一个结点,同一层的结点按照从左到右的顺序打印。

如二叉树(8(6(5,7),10(9,11)))打印出8 6 10 5 7 9 11

1.2. 解决思路

1)使用队列保存要访问的结点;

2)从根结点开始,每次打印结点的时候,如果该结点有子结点,则把该结点的子结点放入队列的末尾。

3)从队列的头部取出最早放进去的结点,重复2)直到队列中所有的结点被打印出来。

1.3. 代码实现

/*
struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;//构造函数使用列表法初始化数据成员。c++允许在struct内定义成员函数,c语言不允许TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};*/
class Solution {
public:vector<int> PrintFromTopToBottom(TreeNode* root) {vector<int> res;queue<TreeNode*> q;if (root == NULL)return res;        q.push(root);while(q.size() != 0){TreeNode* node = q.front();q.pop();res.push_back(node->val);if(node->left != NULL)q.push(node->left);if(node->right != NULL)q.push(node->right);}return res; }
};

2.分行从上到下打印二叉树

2.1 问题描述

从上到下打印出二叉树的每一个结点,同一层的结点按照从左到右的顺序打印,每一层打印到一行。

如二叉树(8(6(5,7),10(9,11)))打印出:

8

6 10

5 7 9 11

2.2 解决思路

在问题1的基础上,添加两个变量:

int toBePrinted:表示当前层中还有多少个需要打印;

int nextLevelNum:表示下一层结点的数目;

2.3 代码实现

与问题1的差异用//*****标记

struct BinaryTreeNode {int value;BinaryTreeNode* pLeft;BinaryTreeNode* pRight;
};void PrintFromTopToBottom(BinaryTreeNode * pTreeRoot){if (!pTreeRoot)return;int toBePrinted = 1;//*****int nextLevelNum = 0;//*****queue<BinaryTreeNode*> q;q.push(pTreeRoot);while (!q.empty()){BinaryTreeNode * pNode = q.front();q.pop();toBePrinted--;//*****cout << pNode->value << " ";if (pNode->pLeft){q.push(pNode->pLeft);nextLevelNum++;//*****}if (pNode->pRight){q.push(pNode->pRight);nextLevelNum++;//*****}//*****控制转行输出if (toBePrinted == 0){cout << endl;toBePrinted = nextLevelNum;nextLevelNum = 0;}}
}

3. 之字形打印二叉树

3.1 问题描述

3.2 解决思路

根绝问题描述可知,奇数层从左到右打印,偶数层从右到左打印,即先访问的结点,其子结点反而是后打印的,所以是一个明显的后进先出结构,需要借助两个栈来完成。

1)如果打印的是奇数层(从左到右),使用1表示奇数,则在第一个栈中,先保存其左子结点,后保存右子结点;

2)如果打印的是偶数层(从右到左),使用0表示偶数,则在第二个栈中,先保存其右子结点,后保存左子结点;

3.3 代码实现

struct BinaryTreeNode {int value;BinaryTreeNode* pLeft;BinaryTreeNode* pRight;
};void PrintFromTopToBottom(BinaryTreeNode * pTreeRoot)
{if (!pTreeRoot)return;stack<BinaryTreeNode*> istack[2];int current = 1;//1表示奇数层,与0不停更替int next = 0;//0表示偶数层,与1不停更替istack[current].push(pTreeRoot);while (!istack[0].empty() && !istack[1].empty()){BinaryTreeNode * pNode = istack[current].top();istack[current].pop();cout << pNode->value << " ";//奇数层先保存左结点,后保存右结点if (current == 1){if (pNode->pLeft)istack[next].push(pNode->pLeft);if (pNode->pRight)istack[next].push(pNode->pRight);}//偶数层先保存右结点,后保存左结点else{if (pNode->pRight)istack[next].push(pNode->pRight);if (pNode->pLeft)istack[next].push(pNode->pLeft);}//判断是否转行进入下一层if (istack[current].empty()){cout << endl;current = 1 - current;next = 1 - next;}}
}

剑指offer 32. 从上到下打印二叉树相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 剑指Offer之从上往下打印二叉树

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路 二叉树的层次遍历,水题...有一个坑:如果root是空的,直接返回空vector,一定要注意边界条件!!!!!!!!! AC ...

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

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

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

    题目描述: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 思路: 其实就是层序遍历,设置一个TreeNode*类型的队列s,用来保存二叉树层序遍历的节点,因为队列是先进先出,所以很好地控制了 ...

  9. 剑指offer23:从上到下打印二叉树

    题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 解题思路 用队列来实现: 从根节点开始,每次打印一个节点都判断该节点是否有子节点,如果有则放在队列末端: 取出队列最前面的节点,重复1 ...

最新文章

  1. enter对应的keycode_键盘对应数字-keycode值大全
  2. 基于深度卷积神经网络的循环优化操作和FPGA加速中的数据流
  3. python字符串/元组/列表/字典互转
  4. centos 7 安装 Vue
  5. 经典日剧、电影、动漫
  6. 计算机科学基础第二版答案,浙江大学计算机科学基础课后习题参考答案new-PXY.doc...
  7. spring mvc学习(55):简单异常处理二
  8. java8新特性(6)— 日期与时间
  9. R语言基础入门(3)之数据类型与相应运算1
  10. 飞鸽传书官方网站 创立黑马程序员训练营
  11. AndroidStudio更改默认编码(不用每次新建项目再更改编码了)
  12. html读取json换行无效,前端Json换行显示
  13. 【渝粤教育】国家开放大学2018年秋季 0734-21T出纳实务 参考试题
  14. EMOS1.6下的php支持GD库
  15. android不root截图,某安卓手机无需root就可以被任意应用截屏及解决方案
  16. 泛型---上界通配符和下界通配符
  17. OpenJudgeNOI4978 宠物小精灵之收服
  18. 虚函数、虚函数表、虚继承
  19. Booth除法器设计
  20. android 8.0发布直播,安卓版微信8.0内测版来了

热门文章

  1. 服务器被挖矿重装系统可以吗,电脑被挖矿了需要重装系统_我网上买了一个重装系统U盘重装系统之后电脑里有一个恶意挖矿软件请问把这个卸载了就可以了吗_区块链百科...
  2. linux plc网络攻击,PLC攻击类型研究分析
  3. 2.1 linux中uboot移植
  4. 记事本保存音标出现乱码问题
  5. 【软件工程】第5章 软件需求分析
  6. 借《Mastering ABP Framework》好好学学这个框架
  7. 三坐标检测之测头校验的原理
  8. [吴功宜]计算机网络学习笔记--第三章 数据链路层
  9. stm32g431之adc
  10. 英特尔携手微软打造全新I/O虚拟化架构,大幅提升加速器和I/O设备的可扩展性