将一棵二叉树按行输出

来源:互联网 发布:安畅网络 程小中 编辑:程序博客网 时间:2024/04/28 17:58

给定一个二叉树,按行从左到右输出一个树。例如按如下格式:
6
5 15
7 9 10 50

1、递归计算,感觉这种办法好傻

public List<List<Integer>> levelOrder(TreeNode root) {        if(root==null)return new ArrayList<List<Integer>>();        List<List<Integer>> listleft=null;        List<List<Integer>> listright=null;        List<List<Integer>> list=new ArrayList<List<Integer>>();        if(root.left!=null){            listleft=levelOrder(root.left);        }        if(root.right!=null){            listright=levelOrder(root.right);        }        if(listleft==null&&listright!=null){            List<Integer> newList=new ArrayList<Integer>();            newList.add(root.val);            list.add(newList);            list.addAll(listright);            return list;        }        if(listleft!=null&&listright==null){            List<Integer> newList=new ArrayList<Integer>();            newList.add(root.val);            list.add(newList);            list.addAll(listleft);            return list;        }        if(listleft==null&&listright==null){            List<Integer> newList=new ArrayList<Integer>();            newList.add(root.val);            list.add(newList);            return list;        }        List<Integer> newList=new ArrayList<Integer>();        newList.add(root.val);        list.add(newList);        int lengthleft=listleft.size();        int lengthright=listright.size();        int i=0,j=0;        while(i<lengthleft&&j<lengthright){            listleft.get(i).addAll(listright.get(j));            j++;i++;        }        list.addAll(listleft);        if(j<lengthright){            for(i=j;i<lengthright;i++){                list.add(listright.get(i));            }        }        return list;    }

2、因为是按层的,根据先序遍历,所有可以用一个level来表示层,向level对应的list中添加数据。

public static void getList(TreeNode root, int level,            List<List<Integer>> list) {        if (root == null)            return;        if (list.size() > level) {            List<Integer> temp = list.get(level);            temp.add(root.val);        } else {            List<Integer> temp = new ArrayList<>();            temp.add(root.val);            list.add(level, temp);        }        getList(root.left, level + 1, list);        getList(root.right, level + 1, list);    }

3、利用队列,先序遍历。

public static void getList(TreeNode root,List<List<Integer>> list){        Queue<TreeNode> queue=new LinkedList<>();        if(root==null)return;        queue.add(root);        int size=queue.size();        while(!queue.isEmpty()){            List<Integer> temp=new ArrayList<>();            for(int i=0;i<size;i++){                TreeNode node=queue.poll();                temp.add(node.val);                if(node.left!=null)queue.add(node.left);                if(node.left!=null)queue.add(node.right);            }            list.add(temp);            size=queue.size();        }    }
0 0