二叉树按层遍历

来源:互联网 发布:淘宝联盟结算时间 编辑:程序博客网 时间:2024/06/05 09:54

题目:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行
方法一:一个队列实现
先将根节点入队列,需要一个变量记录当前层的结点个数 end=queue.size(),第一次循环end=1;
根节点出队列,根节点有左孩子,左孩子入队列,有右孩子右孩子入队列,完成后队列中有2个节点(假设左右孩子都在),记录当前层的结点个数 end=queue.size(),这两个结点依次出队列,并将其左右孩子入队列,依次循环。

public class Solution {    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {        ArrayList<ArrayList<Integer> > listLevel=new ArrayList<ArrayList<Integer> >();        Queue<TreeNode> queue=new LinkedList<TreeNode>();        if(pRoot==null)            return listLevel;        queue.offer(pRoot);        while(!queue.isEmpty()){            ArrayList<Integer> arrayList=new ArrayList<Integer>();            int lo=0,end=queue.size();                while(lo++<end){                    TreeNode node=queue.poll();                    arrayList.add(node.val);                    if(node.left!=null)                        queue.offer(node.left);                    if(node.right!=null)                        queue.offer(node.right);                }                if(arrayList.size()>0)                  listLevel.add(arrayList);              }        return listLevel;        } }

方法二:两个队列实现
1根结点入queue1
2根节点出queue1,根节点左右孩子入queue2,第一次循环后queue1为空
3queue2中的结点依次出队列,左右孩子入queue1,第二次循环完后queue2为空
4依次交替循环

public class Solution {    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {        ArrayList<ArrayList<Integer> > listLevel=new ArrayList<ArrayList<Integer> >();        Queue<TreeNode> queue1=new LinkedList<TreeNode>();        Queue<TreeNode> queue2=new LinkedList<TreeNode>();        if(pRoot==null)            return listLevel;        queue1.offer(pRoot);        while((!queue1.isEmpty())||(!queue2.isEmpty())){          ArrayList<Integer> arrayList=new ArrayList<Integer>();        while(!queue1.isEmpty()){            TreeNode treeNode = queue1.poll();            arrayList.add(treeNode.val);            if(treeNode.left!=null)                queue2.offer(treeNode.left);            if(treeNode.right!=null)                queue2.offer(treeNode.right);        }            if(arrayList.size()>0)            listLevel.add(arrayList);            arrayList=new ArrayList<Integer>();            //交换两个队列          //  listLevel.add(arrayList);          //  swap(queue1,queue2);             while(!queue2.isEmpty()){            TreeNode treeNode = queue2.poll();            arrayList.add(treeNode.val);            if(treeNode.left!=null)                queue1.offer(treeNode.left);            if(treeNode.right!=null)                queue1.offer(treeNode.right);        }            if(arrayList.size()>0)              listLevel.add(arrayList);        }        return listLevel;    }