打赏

剑指offer:二叉树打印成多行(层次遍历)

1. 题目描述

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。

2. 思路

层次遍历

3. 递归

public class Solution {
    ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        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);
    }
}

4. 非递归

import java.util.*;

public class Solution {
    static ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        return levelorder(pRoot);
    }

    public static ArrayList<ArrayList<Integer>> levelorder(TreeNode root) {
        Queue<TreeNode> queue = new LinkedList<>();
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        if(root == null) return result;
        queue.offer(root); // 首先将根节点root入队
        while (!queue.isEmpty()) {// Queue不为空则循环
            ArrayList<Integer> node = new ArrayList<>();// 保存每一层节点的值
            int length = queue.size();// 每一层的节点数目
            while (length > 0) {
                TreeNode tree = queue.poll();
                if (tree.left != null) {
                    queue.offer(tree.left);
                }
                if (tree.right != null) {
                    queue.offer(tree.right);
                }
                node.add(tree.val);
                length--;
            }
            // 循环结束后,得到的Queue为下一层做准备,node为本层遍历结果
            result.add(node);
        }
        return result;
    }
}

 

posted @ 2019-09-15 01:17  海米傻傻  阅读(191)  评论(0编辑  收藏  举报