comments: true
difficulty: 中等
edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9832%20-%20I.%20%E4%BB%8E%E4%B8%8A%E5%88%B0%E4%B8%8B%E6%89%93%E5%8D%B0%E4%BA%8C%E5%8F%89%E6%A0%91/README.md
面试题 32 - I. 从上到下打印二叉树
题目描述
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的次序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7],
返回:
提示:
解法
方法一:BFS
我们可以通过 BFS 遍历二叉树,将每一层的节点值存入数组中,最后返回数组即可。
时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)。其中 n n n 为二叉树的节点数。
Python3
- # Definition for a binary tree node.
- # class TreeNode:
- # def __init__(self, x):
- # self.val = x
- # self.left = None
- # self.right = None
- class Solution:
- def levelOrder(self, root: TreeNode) -> List[int]:
- ans = []
- if root is None:
- return ans
- q = deque([root])
- while q:#保证层序下去
- for _ in range(len(q)):
- node = q.popleft()
- ans.append(node.val)
- if node.left:
- q.append(node.left)
- if node.right:
- q.append(node.right)
- return ans
复制代码 Java
- /**
- * Definition for a binary tree node.
- * public class TreeNode {
- * int val;
- * TreeNode left;
- * TreeNode right;
- * TreeNode(int x) { val = x; }
- * }
- */
- class Solution {
- public int[] levelOrder(TreeNode root) {
- if (root == null) {
- return new int[] {};
- }
- Deque<TreeNode> q = new ArrayDeque<>();
- q.offer(root);
- List<Integer> res = new ArrayList<>();
- while (!q.isEmpty()) {
- for (int n = q.size(); n > 0; --n) {
- TreeNode node = q.poll();
- res.add(node.val);
- if (node.left != null) {
- q.offer(node.left);
- }
- if (node.right != null) {
- q.offer(node.right);
- }
- }
- }
- int[] ans = new int[res.size()];
- for (int i = 0; i < ans.length; ++i) {
- ans[i] = res.get(i);
- }
- return ans;
- }
- }
复制代码 C++
- /**
- * Definition for a binary tree node.
- * struct TreeNode {
- * int val;
- * TreeNode *left;
- * TreeNode *right;
- * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
- * };
- */
- class Solution {
- public:
- vector<int> levelOrder(TreeNode* root) {
- if (!root) {
- return {};
- }
- vector<int> ans;
- queue<TreeNode*> q{{root}};
- while (!q.empty()) {
- for (int n = q.size(); n; --n) {
- auto node = q.front();
- q.pop();
- ans.push_back(node->val);
- if (node->left) {
- q.push(node->left);
- }
- if (node->right) {
- q.push(node->right);
- }
- }
- }
- return ans;
- }
- };
复制代码 Go
- /**
- * Definition for a binary tree node.
- * type TreeNode struct {
- * Val int
- * Left *TreeNode
- * Right *TreeNode
- * }
- */
- func levelOrder(root *TreeNode) (ans []int) {
- if root == nil {
- return
- }
- q := []*TreeNode{root}
- for len(q) > 0 {
- for n := len(q); n > 0; n-- {
- node := q[0]
- q = q[1:]
- ans = append(ans, node.Val)
- if node.Left != nil {
- q = append(q, node.Left)
- }
- if node.Right != nil {
- q = append(q, node.Right)
- }
- }
- }
- return
- }
复制代码 TypeScript
- /**
- * Definition for a binary tree node.
- * class TreeNode {
- * val: number
- * left: TreeNode | null
- * right: TreeNode | null
- * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
- * this.val = (val===undefined ? 0 : val)
- * this.left = (left===undefined ? null : left)
- * this.right = (right===undefined ? null : right)
- * }
- * }
- */
- function levelOrder(root: TreeNode | null): number[] {
- const ans: number[] = [];
- if (!root) {
- return ans;
- }
- const q: TreeNode[] = [root];
- while (q.length) {
- const t: TreeNode[] = [];
- for (const { val, left, right } of q) {
- ans.push(val);
- left && t.push(left);
- right && t.push(right);
- }
- q.splice(0, q.length, ...t);
- }
- return ans;
- }
复制代码 Rust
- // Definition for a binary tree node.
- // #[derive(Debug, PartialEq, Eq)]
- // pub struct TreeNode {
- // pub val: i32,
- // pub left: Option<Rc<RefCell<TreeNode>>>,
- // pub right: Option<Rc<RefCell<TreeNode>>>,
- // }
- //
- // impl TreeNode {
- // #[inline]
- // pub fn new(val: i32) -> Self {
- // TreeNode {
- // val,
- // left: None,
- // right: None
- // }
- // }
- // }
- use std::cell::RefCell;
- use std::collections::VecDeque;
- use std::rc::Rc;
- impl Solution {
- pub fn level_order(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
- let mut ans = Vec::new();
- let mut q = VecDeque::new();
- if let Some(node) = root {
- q.push_back(node);
- }
- while let Some(node) = q.pop_front() {
- let mut node = node.borrow_mut();
- ans.push(node.val);
- if let Some(l) = node.left.take() {
- q.push_back(l);
- }
- if let Some(r) = node.right.take() {
- q.push_back(r);
- }
- }
- ans
- }
- }
复制代码 JavaScript
- /**
- * Definition for a binary tree node.
- * function TreeNode(val) {
- * this.val = val;
- * this.left = this.right = null;
- * }
- */
- /**
- * @param {TreeNode} root
- * @return {number[]}
- */
- var levelOrder = function (root) {
- const ans = [];
- if (!root) {
- return ans;
- }
- const q = [root];
- while (q.length) {
- const t = [];
- for (const { val, left, right } of q) {
- ans.push(val);
- left && t.push(left);
- right && t.push(right);
- }
- q.splice(0, q.length, ...t);
- }
- return ans;
- };
复制代码 C#
- /**
- * Definition for a binary tree node.
- * public class TreeNode {
- * public int val;
- * public TreeNode left;
- * public TreeNode right;
- * public TreeNode(int x) { val = x; }
- * }
- */
- public class Solution {
- public int[] LevelOrder(TreeNode root) {
- if (root == null) {
- return new int[]{};
- }
- Queue<TreeNode> q = new Queue<TreeNode>();
- q.Enqueue(root);
- List<int> ans = new List<int>();
- while (q.Count != 0) {
- int x = q.Count;
- for (int i = 0; i < x; i++) {
- TreeNode node = q.Dequeue();
- ans.Add(node.val);
- if (node.left != null) {
- q.Enqueue(node.left);
- }
- if (node.right != null) {
- q.Enqueue(node.right);
- }
- }
- }
- return ans.ToArray();
- }
- }
复制代码 Swift
- /* public class TreeNode {
- * var val: Int
- * var left: TreeNode?
- * var right: TreeNode?
- * init(_ val: Int) {
- * self.val = val
- * self.left = nil
- * self.right = nil
- * }
- * }
- */
- class Solution {
- func levelOrder(_ root: TreeNode?) -> [Int] {
- guard let root = root else {
- return []
- }
- var queue: [TreeNode] = [root]
- var result: [Int] = []
- while !queue.isEmpty {
- let node = queue.removeFirst()
- result.append(node.val)
- if let left = node.left {
- queue.append(left)
- }
- if let right = node.right {
- queue.append(right)
- }
- }
- return result
- }
- }
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |