今天看书刚刚看到层序遍历这里,写一个分享,就算记录一下假期学习过程
(在Acwing这里真的能学到很多啊hh)
题目描述
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
样例
给定二叉树: [3,9,20,null,null,15,7],
返回其层次遍历结果
[
[3],
[9,20],
[15,7]
]
算法
在进行层序遍历时,完成某一层结点的访问后,再按他们的访问次序依次访问各节点的左右孩子,这样一层一层进行下去,先遇到的节点先访问,这与队列的操作过程是吻合的,所以我们可以设置一个队列,从根节点开始遍历,然后执行下面三个操作:
1.从队列中取出一个元素;
2.访问该元素所指节点;
3.若该元素所指的左右孩子节点非空,则将其左,右孩子的指针顺序入队。
不断执行这三步操作,知道队列为空,再无元素可取,二叉树的层序遍历就完成了。
(数据结构浙江大学第二版)
C++ 代码
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
TreeNode* temp;
queue<TreeNode*> Q;
if(!root)return ans;
Q.push(root); //根节点入队
while(!Q.empty())
{
vector<int> v;
int i = 1,j = Q.size();
while(i <= j)
{
temp = Q.front(),Q.pop(); //从队列取出一个元素
v.push_back(temp->val); //访问该元素所指节点
//若该元素所指的左右节点的左右孩子节点非空,则将其左右孩子的指针入队
if(temp->left) Q.push(temp->left);
if(temp->right) Q.push(temp->right);
i++;
}
ans.push_back(v);
}
return ans;
}
};