二叉树的广度优先遍历
二叉树的广度优先遍历
//二叉树bfs广度搜索遍历demon(使用队列)
void bfs(TreeNode node) {
Deque<TreeNode> deque = new ArrayDeque();
deque.add(node);
while (deque != null) {
//利用队列先进先出原则,依次添加左右节点给队列
TreeNode treeNode = deque.poll();
if (treeNode != null) {
deque.add(treeNode.left);
}
if (treeNode != null) {
deque.add(treeNode.right);
}
}
}
二叉树中的广度优先与深度优先区别:
letcode Top102二叉树的层序遍历:
/**
* 102. 二叉树的层序遍历
* 给你一个二叉树,请你返回其按 层序遍历 得到的节点值。(即逐层地,从左到右访问所有节点)。
* 示例:
* 二叉树:[3,9,20,null,null,15,7],
*
* 3
* / \
* 9 20
* / \
* 15 7
* 返回其层序遍历结果:
*
* [
* [3],
* [9,20],
* [15,7]
* ]
*/
public class Top102二叉树的层序遍历 {
/**
* 方式一:使用深度优先dfs进行遍历
* 深度优先遍历特性,故加入辅助遍历,层级,将同层级的放入同数组
*/
/**
* 方式二:使用广度优先bfs遍历,广度优先罗列出来的是一维数组,故每次将一层的节点全部取出
*/
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (null == root) {
return result;
}
bfs(root,result);
return result;
}
void bfs(TreeNode treeNode, List<List<Integer>> result) {
Deque<TreeNode> deque = new ArrayDeque<>();
deque.add(treeNode);
while (!deque.isEmpty()) {
int size = deque.size();
List<Integer> list = new ArrayList<>();
for (int i = 0; i <size ; i++) {
TreeNode node = deque.poll();
list.add(node.val);
if (node.left != null) {
deque.add(node.left);
}
if (node.right != null) {
deque.add(node.right);
}
}
result.add(list);
}
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}