算法思路:
二叉树的层次遍历,该算法的重点在于找到每一层次的最后一个结点,初始第一层的最后一个结点last为root,然后将根结点放入队列,以队列不为空的条件循环遍历,设置下一层的最后一个结点为preLast,对于出队的结点的左右结点进行入队操作(前提是入队的结点不为空)并且将入队的结点赋值给preLast,当出队的结点是最后一个结点时,则preLast即为下一层的最后一个结点,然后更新last结点为preLast,将该层遍历的元素加入到list数组中,然后继续遍历,重复这以上过程,直到循环条件为假。
该算法的时间复杂的为O(n),空间复杂度为O(n)。参考代码:
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> listArray = new ArrayList<List<Integer>>();
List<Integer> list = new ArrayList<Integer>();
Queue<TreeNode> queue = new LinkedList<TreeNode>();
if(root==null)
return listArray;
TreeNode last = root;
queue.add(root);
TreeNode preLast=null;
while(!queue.isEmpty()){
TreeNode pNode = queue.remove();
list.add(pNode.val);
if(pNode.left!=null){
queue.add(pNode.left);
preLast = pNode.left;
}
if(pNode.right!=null){
queue.add(pNode.right);
preLast = pNode.right;
}
if(pNode.equals(last)){
last = preLast;
listArray.add(list);
list = new ArrayList<Integer>();
}
}
return listArray;
}