22、从上往下打印二叉树 && 59、把二叉树打印成多行
2017-05-27 11:01
351 查看
题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印。
时间限制:1秒 空间限制:32768K
有类似的想法,不过想到了遍历vector却没想到用队列,就把问题复杂化了,所以这道题还是借鉴了别人的方法。
思路:广度优先算法(BFS)
用一个队列放入还没有打印(放入结果容器)的节点,只要队列不为空,循环执行打印的过程,每次取队列最前面一个,同时删除队列里的这一个,将这个节点的值放入结果容器,并把这一节点的左右子节点放到队列后面。
需要注意的一点:放入左右子节点时,不需要判断子节点是否为空,因为如果是空,相当于把空指针放入队列,在取出后会判断,如果该节点为空就continue了。
代码:
后面一道相似的问题,59 把二叉树打印成多行
题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路:乍一看是和上一题相同的题目,区别就是需要按层分行打印,那么用什么来表示该换行了呢?
可以定义两个变量,一个变量表示在当前层中还没有打印的节点数,另一个变量表示下一层节点的数目。
代码:
时间限制:1秒 空间限制:32768K
有类似的想法,不过想到了遍历vector却没想到用队列,就把问题复杂化了,所以这道题还是借鉴了别人的方法。
思路:广度优先算法(BFS)
用一个队列放入还没有打印(放入结果容器)的节点,只要队列不为空,循环执行打印的过程,每次取队列最前面一个,同时删除队列里的这一个,将这个节点的值放入结果容器,并把这一节点的左右子节点放到队列后面。
需要注意的一点:放入左右子节点时,不需要判断子节点是否为空,因为如果是空,相当于把空指针放入队列,在取出后会判断,如果该节点为空就continue了。
代码:
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: vector<int> PrintFromTopToBottom(TreeNode* root) { if(root==NULL) return vector<int>(); queue<TreeNode*> que; que.push(root); vector<int> res; while(!que.empty()){ root = que.front(); que.pop(); if(root==NULL) continue; res.push_back(root->val); que.push(root->left); que.push(root->right); } return res; } };
后面一道相似的问题,59 把二叉树打印成多行
题目描述:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路:乍一看是和上一题相同的题目,区别就是需要按层分行打印,那么用什么来表示该换行了呢?
可以定义两个变量,一个变量表示在当前层中还没有打印的节点数,另一个变量表示下一层节点的数目。
代码:
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; */ class Solution { public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int> > res; vector<int> temp; if(pRoot==NULL) return res; queue<TreeNode*> nodes; nodes.push(pRoot); int toBePrinted = 1;//本层还没打印的节点个数 int nextlevel = 0;//下一层节点个数 while(!nodes.empty()){ TreeNode* pNode = nodes.front(); nodes.pop(); toBePrinted--; temp.push_back(pNode->val); if(pNode->left!=NULL){ nodes.push(pNode->left); nextlevel++; } if(pNode->right!=NULL){ nodes.push(pNode->right); nextlevel++; } if(toBePrinted==0){//本层打印完了 res.push_back(temp); temp.clear(); toBePrinted = nextlevel;//开始打印下一层 nextlevel = 0;//清空下一层的节点数 } } return res; } };
相关文章推荐
- 22.从上往下打印二叉树
- 面试题22:从上往下打印二叉树
- 102.Binary Tree Level Order Traversal&把二叉树打印成多行
- 剑指Offer(22)______从上往下打印二叉树
- 22.从上往下打印二叉树
- 剑指Offer——(22)从上往下打印二叉树&&层次遍历
- 22、从上往下打印二叉树
- 剑指offer题解C++【22】从上往下打印二叉树
- 面试题23:从上往下打印二叉树(层序遍历) && 面试题25:二叉树中和为某一值的路径
- IMWeb提升营Day4 | 训练题22:从上往下打印二叉树
- 牛客网-剑指offer-22-从上往下打印二叉树
- 22从上往下打印二叉树
- 【剑指offer】22从上往下打印二叉树
- 剑指offer(22)—从上往下打印二叉树
- 剑指offer | 训练题59:把二叉树打印成多行
- 剑指offer-22.从上往下打印二叉树
- 剑指Offer_22_从上往下打印二叉树
- (C++)剑指offer-22:从上往下打印二叉树(举例让抽象具体化)
- 剑指offer 22 从上往下打印二叉树
- 九度 题目1523:从上往下打印二叉树