给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)
您在真实的面试中是否遇到过这个题?
Yes
样例
给出一棵二叉树 {3,9,20,#,#,15,7},
3
/ \
9 20
/ \
15 7
返回它的层次遍历为:
[
[3],
[9,20],
[15,7]
]
挑战
只使用一个队列去实现它
标签 Expand
解题思路:
您在真实的面试中是否遇到过这个题?
Yes
样例
给出一棵二叉树 {3,9,20,#,#,15,7},
3
/ \
9 20
/ \
15 7
返回它的层次遍历为:
[
[3],
[9,20],
[15,7]
]
挑战
只使用一个队列去实现它
标签 Expand
解题思路:
我们可以设置两个队列,想象一下队列的特点,就是先进先出,首先把第0层保存在一个队列中,然后按节点访问,并把已经访问节点的左右孩子节点放在第二个队列中,当第一个队列中的所有节点都访问完成之后,交换两个节点。这样重复下去,知道所有层的节点都被访问,这样做的代价就是空间复杂度有点高。
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* @param root: The root of binary tree.
* @return: Level order a list of lists of integer
*/
public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
// write your code here
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
if(null==root) return res;
Queue<TreeNode> fQ = new LinkedList<>();
fQ.add(root);
while(fQ!=null&&fQ.size()>0){
Queue<TreeNode> sQ = new LinkedList<>();
ArrayList<Integer> depthRoot = new ArrayList<>();
while(fQ!=null&&fQ.size()>0){
TreeNode cur = fQ.poll();
depthRoot.add(cur.val);
if(cur.left!=null){
sQ.add(cur.left);
}
if(cur.right!=null){
sQ.add(cur.right);
}
}
res.add(depthRoot);
fQ = sQ;
}
return res;
}
}