題目描述:給出一顆二叉樹,返回他的層序遍歷,隊列的解法
input 1,null, 2,3 output {[1],[2],[3]}
思路:層序遍歷是廣度優先的BFS的應用
首先建立一個隊列,根節點入隊
隊列不爲空的情況下,根節點出隊,左右子節點入隊,此時隊列裏是下一層的節點
for循環遍歷這一層的隊列,同時再把他們的子節點入隊,上一層的節點出隊,依次類推就是層序遍歷
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct TreeNode
{
int data;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : data(x), left(NULL), right(NULL) {}
};
TreeNode *creatTree(vector<int> &v)
{
TreeNode *root;
if (v.size() == 0)
return NULL;
for (int i = 0; i < v.size(); ++i)
{
if (v[0] == -1)
{
root = NULL;
v.erase(v.begin());
}
else
{
root = new TreeNode(v[0]);
v.erase(v.begin());
root->left = NULL;
root->left = creatTree(v);
root->right = NULL;
root->right = creatTree(v);
}
}
return root;
}
vector<vector<int> > levelOrder(TreeNode *root)
{
if(!root) return {};
vector<vector<int> > res;//二維變量存儲
queue<TreeNode*> q;
q.push(root);
while(!q.empty())//隊列不爲空的時候
{
vector<int> oneLevel; //一維存儲每一層的節點
for(int i = q.size(); i > 0; --i)
{
TreeNode* temp = q.front();
q.pop();
oneLevel.push_back(temp->data);//隊首節點出隊
if(temp->left) q.push(temp->left);
if(temp->right) q.push(temp->right);//左右子節點分別入隊
}
res.push_back(oneLevel);
}
return res;
}
int main()
{
vector<int> v;
int n;
cin >> n;
for (int i = 0; i < n; ++i)
{
int data;
cin >> data;
v.push_back(data);
}
TreeNode *T = creatTree(v);
vector<vector<int> > res;
res = levelOrder(T);
return 0;
}