来源
来源:力扣(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 个节点的值。