题目:二叉树的层序遍历
描述:给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
例如:给定的二叉树是{3,9,20,#,#,15,7},
该二叉树层序遍历的结果是[[3],[9,20],[15,7]]。
示例1:输入:{1,2},返回值:[[1],[2]]
解法一:
思路分析:层序遍历,是将一个结点的左右节点,按照一层层的进行遍历,所以我们使用队列,先进先出,从根结点进行push到队列,如果第二层存在,就是队列出来的顺序,第二层每个执行的元素添加到队列当中,所以添加的所有结点在第二层的后面,假设pop遍历第n层的节点,每个节点会push左右两个节点进去。但是队列先进先出。它会放到队尾(下一层)。直到第n层的最后一个pop出来,第n+1层的还在队列中整齐排着,这就达到一个层序的效果。
实例分析:二叉树{3,9,20,#,#,15,7}
| 二叉树 |
| 3 |
|
|
| 第二层 | 9 |
| 20 |
|
| 第三层 |
| 15 |
| 7 |
| 首先我们创建队列q,将root = 3放进q中,随后对q进行判断,第一层输出[3] | ||||
| 再将第二层放入队列中,pop出队列,返回值[9,20] | ||||
| 同上,最后将第三层[15,7]返回 | ||||
| 最终res容器中的值为[[3],[9,20],[15,7]] | ||||
具体C++代码如下所示:
/** * struct TreeNode { * int val; * struct TreeNode *left; * struct TreeNode *right; * }; */ class Solution { public: /** * * @param root TreeNode类 * @return int整型vector<vector><>> */ vector levelOrder(TreeNode* root) { // write code here vector res;//存放最终的结果值 if(root == NULL) return res; queue<treenode> q;//定义队列 q.push(root);//将根节点放进去 while(!q.empty()){ vector temp;//设立容器 int n = q.size();//队列中容器的大小 for(int i = 0; i < n;i++){ TreeNode* node = q.front();//第一个元素 q.pop(); temp.push_back(node->val);//将第一层的值存放到容器当中 if(node->left != NULL) q.push(node->left);//将左子树放进去 if(node->right != NULL) q.push(node->right);//将右子树放进去 } res.push_back(temp); } return res; } };</treenode></vector>
使用队列对每一层进行添加和存储,所以时间复杂度为O(N),空间复杂度为O(N)。
解法二:
思路分析:在方法一中,我们已经明白了只要将队列中的值一层一层遍历完成,即先遍历第一层的元素,将当前层的元素遍历完成后,再次遍历下一层队列的元素即可完成最终操作。同样我们可以由层次遍历的单层循环变为双层循环,即将内层循环重新遍历一层也可以完成相应功能。
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/
public class Solution {
/**
*
* @param root TreeNode类
* @return int整型ArrayList<arraylist><>>
*/
public ArrayList levelOrder (TreeNode root) {
// write code here
ArrayList res = new ArrayList<>();//创建一个链表,用于存储
if(root == null )
return res;
LinkedList que = new LinkedList<>();
que.offer(root);//用来插入指定的元素插入此优先级队列
while(!que.isEmpty()){
int len = que.size();
ArrayListlist = new ArrayList<>();
while(len > 0){
TreeNode node = que.poll();//poll是队列数据结构实现类的方法,从队首获取元素,同时获取的这个元素将从原队列删除;
list.add(node.val);
if(node.left != null)
que.offer(node.left);
if(node.right != null)
que.offer(node.right);
len--;
}
res.add(list);
}
return res;
}
} </arraylist> 
京公网安备 11010502036488号