劍指 Offer 32 從上到下列印二叉樹系列
- 劍指 Offer 32 - I. 從上到下列印二叉樹
- 劍指 Offer 32 - II. 從上到下列印二叉樹 II
- 劍指 Offer 32 - III. 從上到下列印二叉樹 III
劍指 Offer 32 - I. 從上到下列印二叉樹
從上到下列印出二叉樹的每個節點,同一層的節點按照從左到右的順序列印,
例如:
給定二叉樹: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
回傳:
[3,9,20,15,7]
題解:
這就是一道簡單的BFS
/**
* 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> ans;
if(root==nullptr)
return ans;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){ //BFS模板
TreeNode *temp=q.front();
q.pop();
ans.push_back(temp->val);
if(temp->left!=nullptr)
q.push(temp->left);
if(temp->right!=nullptr)
q.push(temp->right);
}
return ans;
}
};
劍指 Offer 32 - II. 從上到下列印二叉樹 II
從上到下按層列印二叉樹,同一層的節點按從左到右的順序列印,每一層列印到一行,
例如:
給定二叉樹: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
回傳其層次遍歷結果:
[
[3],
[9,20],
[15,7]
]
題解:
之前的博客,遍歷都是通過Visit()函式來列印在控制臺的,這個題目雖說是簡單的BFS層序遍歷,但要求將每層的資料單獨分類,比較有意思,這里用二維陣列,
/**
* 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>> ans;
if(root==nullptr)
return ans;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){ //BFS模板里面嵌套了每層的操作
vector<int> t;
for(int i=q.size();i>0;--i){
TreeNode *temp=q.front();
q.pop();
t.push_back(temp->val);
if(temp->left)
q.push(temp->left);
if(temp->right)
q.push(temp->right);
}
ans.push_back(t);
}
return ans;
}
};
劍指 Offer 32 - III. 從上到下列印二叉樹 III
請實作一個函式按照之字形順序列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右到左的順序列印,第三行再按照從左到右的順序列印,其他行以此類推,
例如:
給定二叉樹: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
回傳其層次遍歷結果:
[
[3],
[20,9],
[15,7]
]
題解:
這里用到了deque雙端佇列
/**
* 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>> ans;
if(root==nullptr)
return ans;
deque<TreeNode*> q;
q.push_back(root);
bool flag=true;
while(!q.empty()){ //BFS模板里面嵌套了每層的操作
vector<int> t;
for(int i=q.size();i>0;--i){
if(flag){
TreeNode *temp=q.front();
q.pop_front();
t.push_back(temp->val);
if(temp->left!=nullptr)
q.push_back(temp->left);
if(temp->right!=nullptr)
q.push_back(temp->right);
}else{
TreeNode *temp=q.back();
q.pop_back();
t.push_back(temp->val);
if(temp->right!=nullptr)
q.push_front(temp->right);
if(temp->left!=nullptr)
q.push_front(temp->left);
}
}
flag=!flag;
ans.push_back(t);
}
return ans;
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/241440.html
標籤:其他
上一篇:C語言 | 最大公約數最小公倍數
