目录
day6:
剑指 Offer 32 - II. 从上到下打印二叉树 II
剑指 Offer 32 - III. 从上到下打印二叉树 III
一. 剑指 Offer 32 - I. 从上到下打印二叉树
题目:
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
示例:
给定二叉树: [3,9,20,null,null,15,7]
,
3
/ \
9 10
/ \
15 7
返回:
[3, 9, 20, 15, 7]
解题思路:
二叉树的 从上至下 打印(即按层打印,又称为二叉树的 广度优先搜索(BFS),BFS 通常借助 队列 的先入先出特性来实现
c++代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> levelOrder(TreeNode* root) {
vector<int> res;
if(!root) return res;
queue<TreeNode*> A;
A.push(root);
while(!A.empty())
{
TreeNode* node = A.front();
A.pop();
res.push_back(node -> val);
if(node -> left) A.push(node -> left);
if(node -> right) A.push(node -> right);
}
return res;
}
};
二 . 剑指 Offer 32 - II. 从上到下打印二叉树 II
题目:
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
示例:
给定二叉树: [3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回:
[
[3],
[ 9, 20],
[ 15, 7]
]
c++代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
queue<TreeNode*> A;
if(root) A.push(root);
while(!A.empty())
{
vector<int> temp;
int cnt = A.size();
for(int i = 0; i < cnt; i++ ) //注释
{
TreeNode* node = A.front();
A.pop();
temp.push_back(node -> val);
if(node -> left) A.push(node -> left);
if(node -> right) A.push(node -> right);
}
res.push_back(temp);
}
return res;
}
};
三. 剑指 Offer 32 - III. 从上到下打印二叉树 III
题目:
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
示例:
给定二叉树: [3,9,20,null,null,15,7]
,
3
/ \
9 10
/ \
15 7
返回:
[
[3],
[ 20, 9],
[ 15, 7]
]
解题思路:
双端队列
c++代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
deque<TreeNode*> A;
if(root) A.push_back(root);
int num = 1;
while(!A.empty())
{
vector<int> temp;
int cnt = A.size();
for(int i = 0; i < cnt; i++ ) //注释
{
TreeNode* node;
if(num % 2 != 0)
{
node = A.front();
A.pop_front();
if(node -> left) A.push_back(node -> left);
if(node -> right) A.push_back(node -> right);
}
else
{
node = A.back();
A.pop_back();
if(node -> right) A.push_front(node -> right);
if(node -> left) A.push_front(node -> left);
}
temp.push_back(node -> val);
}
res.push_back(temp);
num++;
}
return res;
}
};
题目源自: