題目:
從上往下打印出二叉樹的每個節點,同層節點從左至右打印。
思路:廣度優先搜索
/*
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) {
vector<int> v;
queue<TreeNode*> q;
q.push(root);
if(root==NULL) return {};
while(!q.empty())
{
v.push_back(q.front()->val);
if(q.front()->left!=NULL)
q.push(q.front()->left);
if(q.front()->right!=NULL)
q.push(q.front()->right);
q.pop();
}
return v;
}
};
小見:
對二叉樹相關問題掌握的向來都不太好,看了下評論區的答案提到了廣度優先搜索,查了一下廣度優先搜索和深度優先搜索。
首先,本題中使用的廣度優先搜索思想,是指,藉助隊列按層存儲節點,然後只要按順序打印就好了。
具體過程如下:
1、準備:創建一個節點型(需要搜索的節點的類型)隊列,用來存放每一層的頂點;
創建一個int型數組,用來記錄被訪問過的頂點(此處存放該頂點的值);
2、從某個節點(根節點)開始訪問,將這個節點的值設爲true,同時入隊;
3、只要隊列不空,重複如下操作:
(1)隊頭頂點出隊;
(2)依次檢查該頂點的所有鄰接節點(左右子樹),如果值爲falsh,則訪問、置爲true併入隊,反之不訪問;
備註:在二叉樹中不存在重複訪問的情況,即不存在多對一的情況,所以這一步不需要;而用來記錄訪問節點的數組在本題中可以作爲存放各頂點的值(它的使用順序與節點入隊順序一致);
關於廣度優先搜索與深度優先搜索的相關知識整理如下:
https://www.cnblogs.com/skywang12345/p/3711483.html
https://blog.csdn.net/weixin_40953222/article/details/80544928
廣度藉助隊列,深度藉助棧