1. 程式人生 > >牛客網刷題之把二叉樹列印成多行

牛客網刷題之把二叉樹列印成多行

題目描述:

這裡寫圖片描述

解題思路:

這題和前面之字形列印那題類似,不同的是,判斷到達每一層重點時只需要換行即可。同樣可以用start和end兩個代表每一行的起始與終止。其他就是樹的遍歷問題了。

題解:

ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        if(pRoot == null){
            return res;
        }
        Queue
<TreeNode> queue = new LinkedList<>();//儲存每一行結點 ArrayList<Integer> list = new ArrayList<>();//儲存結點的數值 int start = 0; int end = 1; queue.add(pRoot); while(!queue.isEmpty()){ TreeNode curNode = queue.poll(); list.add(curNode.
val); start ++; if(curNode.left != null){ queue.add(curNode.left); } if(curNode.right != null){ queue.add(curNode.right); } if(start == end){ start = 0; end = queue.
size(); res.add(list); list = new ArrayList<>(); } } return res; }

ac結果:

這裡寫圖片描述
看討論區裡還有個哥們用的遞迴來解,這裡稍微改一下:

    ArrayList<ArrayList<Integer>> list = new ArrayList<>();
        depth(pRoot, 1, list);
        return list;
    }

    private void depth(TreeNode root, int depth,
            ArrayList<ArrayList<Integer>> list) {
        if (root == null)
            return;
        if (depth > list.size())
            list.add(new ArrayList<Integer>());
        list.get(depth - 1).add(root.val);

        depth(root.left, depth + 1, list);
        depth(root.right, depth + 1, list);
    }

ac結果:
這裡寫圖片描述