Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).
For example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
本题和中序遍历有一点区别,就是程序需要知道当前所在的层
如果不用队列,则很容易想到存储每一行的节点的方法
代码如下
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) {
return null;
}
//结果list
List<List<Integer>> re = new ArrayList<List<Integer>>();
//
List<TreeNode> nodesList = new ArrayList<TreeNode>();
nodesList.add(root);
while (nodesList != null) {
List<TreeNode> tmpList = new ArrayList<TreeNode>();
List<Integer> integerList = new ArrayList<Integer>();
for (TreeNode treeNode : nodesList) {
integerList.add(treeNode.val);
if (treeNode.left != null) {
tmpList.add(treeNode.left);
}
if (treeNode.right != null) {
tmpList.add(treeNode.right);
}
}
re.add(integerList);
nodesList = tmpList;
}
return re;
}
难点在于使用队列进行中序遍历时该如何记录所在行
1.因为第一层只有一个节点,因此第二次就将null入队
2.每当访问到null时,说明进入了下一行,于是将null再次入队,并进行下一次循环
注意:如果访问到null时队列已经空了就不用在加入null,这样的话会造成死循环
java代码如下
public List<List<Integer>> levelOrder2(TreeNode root){
List<List<Integer>> re = new ArrayList<List<Integer>>();
Queue<TreeNode> treeNodeQueue = new LinkedList<TreeNode>();
if (root == null) {
return re;
}
treeNodeQueue.add(root);
treeNodeQueue.add(null);
List<Integer> integerList = new ArrayList<Integer>();
while (treeNodeQueue.size() != 0) {
TreeNode now = treeNodeQueue.poll();
//空标识,将整行加入
if (now == null) {
re.add(integerList);
integerList = new ArrayList<Integer>();
if(treeNodeQueue.size()!=0) {
treeNodeQueue.add(null);
}
continue;
}
integerList.add(now.val);
TreeNode left = now.left;
TreeNode right = now.right;
if (left != null) {
treeNodeQueue.add(left);
}
if (right != null) {
treeNodeQueue.add(right);
}
}
return re;
}