二叉树的层序遍历就是从根节点开始,一层一层的显示节点数据,每一层都是从左往右。如下图所示,层序遍历的结构就为:‘*’->‘-’->‘C’->‘+’->‘B’->‘E’->‘F’。
要想实现层序遍历,可以使用队列的数据结构。借用其先进先出的特点,每当访问到一个节点时,就将节点的数据打印并把左右子节点放入队列中
。过程如下图
具体实现的代码
1.树节点定义:
class TreeNode
{
public:
char data;
TreeNode *leftChild;
TreeNode *rightChild;
TreeNode();
TreeNode(char _data) :data(_data), leftChild(nullptr), rightChild(nullptr){
}
TreeNode(char _data, TreeNode* _leftChild, TreeNode* _rightChild)
:data(_data), leftChild(_leftChild), rightChild(_rightChild){
}
};
2.层序遍历代码:
void levelOrder(TreeNode* node)
{
std::queue<TreeNode*> que;
TreeNode* current = node;
if (current != nullptr)
que.push(current);
while (!que.empty()){
current = que.front();
que.pop();
std::cout << current->data;
if (current->leftChild) que.push(current->leftChild);
if (current->rightChild) que.push(current->rightChild);
}
std::cout << std::endl;
}
写到这里,我们工作基本完成,但是为了以后方便处理每个节点的数据,我们需要返回所有节点的数据。
可以使用vector向量,将每个节点的数据放入vector中,然后返回这个vector。修改后的代码如下:
vector<char> levelOrderRetVect(TreeNode* node)
{
std::queue<TreeNode*> que;
TreeNode* current = node;
vector<char> vec;
if (current != nullptr)
que.push(current);
while (!que.