【剑指offer】32.1 从上到下打印二叉树

116 阅读1分钟

题目描述

在这里插入图片描述 在这里插入图片描述

// 力扣
// 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

// 牛客
// 从上往下打印出二叉树的每个节点,同层节点从左至右打印。

题解

就是数的层序遍历,只是需要把遍历的结点值保存

层序遍历可以见:

www.runoob.com/data-struct…

// 力扣
// 执行用时:1 ms, 在所有 Java 提交中击败了99.78%的用户
// 内存消耗:38.3 MB, 在所有 Java 提交中击败了94.10%的用户
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.Queue;
class Solution {
    public int[] levelOrder(TreeNode root) {
        if (root == null)
            return new int[0];  // 如果root为空直接返回空列表
        int size = 0;  // 最终结果列表需要记录size来构建
		// 第一个队列q(用链表模拟队列),用于层序遍历
        LinkedList<TreeNode> q = new LinkedList<>();  
		// 第二个队列q_val,用于保存结点的值,待会放进列表中
        Queue<Integer> q_val = new LinkedList<Integer>();  
        q.offer(root);  // 头结点入队q(add也可以,只是offer不抛出异常)
        // 当q为空,即q中所有结点都出队,说明root的所有结点都已经遍历过
		while (!q.isEmpty()) {
            TreeNode node = q.remove();  // 把放进q的结点出队,记为node
            size++; 
            q_val.add(node.val);  // 结点node的值存入q_val
            if (node.left != null)  // 出队结点node如果有左结点
                q.add(node.left);  // node左结点入队q
            if (node.right != null)  // 出队结点node如果有右结点
                q.add(node.right);  // node右结点入队q
        }  
        int[] res = saveToList(size, q_val);  // 把q_val中的值存入列表res
        return res;
    }

    private int[] saveToList(int size, Queue<Integer> q_val) {
        int[] res = new int[size];
        for (int i = 0; i < size; i++) {
            res[i] = q_val.poll();
        }
        return res;
    }
}


// 牛客
// 运行时间:12ms
// 占用内存:9660k
import java.util.ArrayList;
import java.util.LinkedList;
public class Solution {
    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        ArrayList<Integer> res = new ArrayList<>();
        if (root == null)
            return res;
        LinkedList<TreeNode> q = new LinkedList<>();
        q.offer(root);
        while (!q.isEmpty()) {
            TreeNode node = q.remove();
            res.add(node.val);
            if (node.left != null)
                q.add(node.left);
            if (node.right != null) {
                q.add(node.right);
            }
        }
        return res;
    }
}