来源
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
描述
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
题解
如何遍历一棵树,有两种通用的遍历树的策略:
- 深度优先搜索(DFS)
在这个策略中,我们采用深度作为优先级,以便从根开始一直到达某个确定的叶子,然后再返回根到达另一个分支。
深度优先搜索策略又可以根据根节点、左孩子和右孩子的相对顺序被细分为先序遍历,中序遍历和后序遍历。
- 宽度优先搜索(BFS)
我们按照高度顺序一层一层的访问整棵树,高层次的节点将会比低层次的节点先被访问到。
递归法
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/class Solution {List<List<Integer>> levels = new ArrayList<List<Integer>>();public List<List<Integer>> levelOrder(TreeNode root) {if (root == null) return levels;helper(root, 0);return levels;}public void helper(TreeNode node, int level) {if (levels.size() == level) {levels.add(new ArrayList<Integer>());}levels.get(level).add(node.val);if (node.left != null) helper(node.left, level + 1);if (node.right != null) helper(node.right, level + 1);}}
- 时间复杂度:
,因为每个节点恰好会被运算一次。
-
迭代法
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/class Solution {public List<List<Integer>> levelOrder(TreeNode root) {List<List<Integer>> levels = new ArrayList<List<Integer>>();if (root == null) return levels;Deque<TreeNode> deque = new LinkedList<>();deque.add(root);int level = 0;while (!deque.isEmpty()) {levels.add(new ArrayList<Integer>());int dequeSize = deque.size();for (int i = 0; i < dequeSize; i++) {TreeNode node = deque.remove();levels.get(level).add(node.val);if (node.left != null) deque.add(node.left);if (node.right != null) deque.add(node.right);}level++;}return levels;}}
复杂度分析
时间复杂度:
,因为每个节点恰好会被运算一次。
- 空间复杂度:
,保存输出结果的数组包含 N 个节点的值。
