二叉树层次遍历函数实现:
public List<List<Integer>> levelOrder(TreeNode root) { List result=new ArrayList(); if (root==null){ return result; } Queue<TreeNode> queue=new LinkedList<TreeNode>(); queue.offer(root); while (!queue.isEmpty()){ ArrayList<Integer> level=new ArrayList<Integer>(); int size=queue.size(); //层次遍历,内层for循环执行之前,queue里保存的结点是本层的结点,没有下一层结点,size记录的是本层结点数 //因为在执行for循环的过程中,queue逐渐加入下一层结点,结点数会变化,所以先用size记下本层结点数,在for循环执行过程中,size值不变 //for循环执行前,queue里保存的是本层结点,执行过程中,本层结点逐个弹出,并加入对应子节点,因此for循环执行过程中不断加入下一层节点 //for循环执行结束后,queue里保存的是下一层节点,不再有本层节点 for (int i=0;i<size;i++){ TreeNode temp=queue.poll(); level.add(temp.val); if (temp.left!=null){ queue.add(temp.left); } if (temp.right!=null){ queue.add(temp.right); } }//层次遍历,内层for循环执行一遍后,queue里保存的结点是下一层的结点,不再有本层节点 result.add(level); } return result; }
总结:
仔细思考程序执行的细节;
使用了一遍Queue,这个平时使用得比较少;
Java的集合框架还要深入学习一下。