【剑指offer-JZ78】把二叉树打印成多行

84 阅读1分钟

层次遍历二叉树:

public  void levelOrderTraversal (Node root) {
    Queue<Node> queue = new LinkedList<Node>();
    queue.offer(root);
    while (!queue.isEmpty()) {
        root = queue.poll();
        System.out.print(root.value);
        if (root.left != null) {
            queue.offer(root.left);
        }
        if (root.right != null) {
            queue.offer(root.right);
        }
    }
}
层次打印二叉树
示例1
输入:
{1,2,3,#,#,4,5}
返回值:
[[1],[2,3],[4,5]]



示例2
输入:
{8,6,10,5,7,9,11}
返回值:
[[8],[6,10],[5,7,9,11]]

其实就是BFS搜索,需要加一个for循环:

ArrayList<ArrayList<Integer>> Print(Node pRoot) {
    ArrayList<ArrayList<Integer>> thelist = new ArrayList<ArrayList<Integer>>();
    if(pRoot==null)return thelist; //这里要求返回thelist而不是null
    Queue<Node> queue = new LinkedList<Node>();
    queue.offer(pRoot);
    while(!queue.isEmpty()){
        ArrayList<Integer> list = new ArrayList<Integer>();
        int size = queue.size();
        for(int i=0;i<size;i++){
            pRoot = queue.poll();
            list.add(pRoot.value);
            if (pRoot.left != null) {
                queue.offer(pRoot.left);
            }
            if (pRoot.right != null) {
                queue.offer(pRoot.right);
            }
        }
        thelist.add(list);
    }
    return thelist;
}

之字型打印:

在BFS层次打印的基础上,维护一个深度变量dep。每次将子数组list添加到总数组all中的时候,深度就加1。

  • 当dep为奇数的时候,使用ArrayList.add(obj)来在尾部追加
  • 当dep为偶数的时候,使用ArrayList.add(0,obj)来在头部追加
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
     ArrayList<ArrayList<Integer>> all = new ArrayList<ArrayList<Integer>>();
        if(pRoot==null)return all; 
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(pRoot);
        int dep=1;
        while(!queue.isEmpty()){
            ArrayList<Integer> list = new ArrayList<Integer>();
            int size = queue.size();
            for(int i=0;i<size;i++){
                pRoot = queue.poll();
                
                // 不同的添加方式
                if(dep%2==1) list.add(pRoot.val);
                else if (dep%2==0) list.add(0, pRoot.val);
                
                
                if (pRoot.left != null) {
                    queue.offer(pRoot.left);
                }
                if (pRoot.right != null) {
                    queue.offer(pRoot.right);
                }
            }
            all.add(list);
            dep++;
        }
        return all;
    }

}


题源:www.nowcoder.com/practice/44…