代码随想录-06-二叉树-05.01 二叉树的层序遍历
二叉树的层序遍历
思路
使用队列来实现对二叉树的节点访问,类似于广度优先遍历。
具体代码
CPP
下面代码的访问顺序只是存在一个数组中,并没有按层访问,
如果要添加每层的顺序那么就是每层里加上vector<int> temp
就可以了。
class Solution{
public:
vector<int> traversal(TreeNode *root){
queue<TreeNode*> que;
if(!root)
return res;
que.push(root);
while(!que.empty()){
// 控制当前递归的个数
int size = que.size();
while(size--){
TreeNode* cur = que.front();
que.pop();
if(cur->left)
que.push(cur->left);
if(cur->right)
que.push(cur->right);
res.push_back(cur->val);
}
}
return res;
}
private :
vector<int> res;
}
Java
- 定义一个队列存储每层的元素;
- 对每层元素:先记录该层元素的个数,然后从左到右依次遍历,并将访问的结果压栈;
- 每访问一个节点,查找是否有左右孩子。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private Queue<TreeNode> q = new ArrayDeque<>();
List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) {
return res;
}
q.add(root);
while (!q.isEmpty()) {
List<Integer> temp = new ArrayList<>();
int size = q.size();
while (size > 0) {
TreeNode cur = q.remove();
if (cur.left != null) {
q.add(cur.left);
}
if (cur.right != null) {
q.add(cur.right);
}
size--;
temp.add(cur.val);
}
res.add(temp);
}
return res;
}
}