题目描述
// 力扣
// 从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
// 牛客
// 从上往下打印出二叉树的每个节点,同层节点从左至右打印。
题解
就是数的层序遍历,只是需要把遍历的结点值保存
层序遍历可以见:
// 力扣
// 执行用时: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;
}
}