您的位置:首页 > 其它

二叉树的层序遍历

2015-10-27 17:13 211 查看
二叉树的层序遍历就是按照二叉树的深度分层遍历,也就是广度优先遍历(BFS)。层序遍历使用队列,一种先进先出(FIFO)的数据结构。下面简单介绍下二叉树 的层序遍历。

层序遍历从根节点开始,将根节点压入队列中,每次访问一个节点,就将其左右儿子节点压入队列中,直到队列为空,说明遍历结束。代码如下:

class Solution {
public:
vector<int> levelOrder(TreeNode* root) {
vector<int> ret;
if(root==NULL)return ret;
queue<TreeNode*> q;
q.push(root);
while(!q.empty())
{
TreeNode *curr=q.front();
q.pop();
ret.push_back(curr->val);
if(curr->left)q.push(curr->left);
if(curr->right)q.push(curr->right);
}
return ret;
}
};
例如如下的二叉树,结果如下:



结果:[1,2,3,4,5,9,4,7,0]

更近一步,如果需要将结果存在一个二维数组里(这里的二维数组长度不一),我们需要将每一层的数据保存起来,我们需要在根节点后压入NULL节点表示一层结束,当以后每访问到NULL节点时,说明当前层已经遍历完毕。代码如下:

class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
vector<int> level_data;
if(root==NULL)
return res;
queue<TreeNode*> q;
q.push(root);
q.push(NULL);
while(!q.empty())
{
TreeNode* temp=q.front();
q.pop();
if(temp)
{
level_data.push_back(temp->val);
if(temp->left)
q.push(temp->left);
if(temp->right)
q.push(temp->right);
}
else
{
if(!level_data.empty())
{
q.push(NULL);
res.push_back(level_data);
level_data.clear();
}
}
}
return res;
}
};
对于上面的二叉树,结果如下:

[

[1],

[2,3],

[4,5,9],

[4,7,0]

]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: