二叉树分层遍历实现,
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
返回其层次遍历结果:[[3],[9,20],[15,7]]
应用场景
实现方式
利用外部队列遍历
算法思想:广度优先搜索BFS
- 以一个FIFO的队列存储节点;
- 在遍历当前层时,把当前层的左右子节点入队;
- 当前层遍历完后再从队列获取节点,遍历下一层;
- 队列为空时完成树的遍历;
递归逐层遍历
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue;
public static List<List<Integer>> levelOrder_queue(TreeNode root) { if (root == null) { return levels; } Queue<TreeNode> queue = new LinkedList<>(); queue.add(root);
int level = 0; while (!queue.isEmpty()) { levels.add(new ArrayList<>());
int level_length = queue.size(); for (int i = 0; i < level_length; ++i) { TreeNode node = queue.remove();
levels.get(level).add(node.val);
if (node.left != null) { queue.add(node.left); } if (node.right != null) { queue.add(node.right); } } level++; } return levels; }
public static List<List<Integer>> levelOrder_recurse(TreeNode root) { if (root == null) { return levels; } helper(root, 0); return levels; }
private static 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); } }
|