BFS就是一层一层的打印,如下图所示
只需要使用一个队列,把每层的节点都存放到队列中,然后再一个个出队,顺便把子节点在一个个存放到队列中……一直这样循环下去,直到队列为空为止,在373,数据结构-6,树的时候也提到过二叉树的BFS遍历,他的代码如下
public void levelOrder(TreeNode tree) { if (tree == null) return; Queue<TreeNode> queue = new LinkedList<>(); queue.add(tree);//相当于把数据加入到队列尾部 while (!queue.isEmpty()) { //poll方法相当于移除队列头部的元素 TreeNode node = queue.poll(); System.out.println(node.val); if (node.left != null) queue.add(node.left); if (node.right != null) queue.add(node.right); } }也可以对上面的代码进行改造,改造的原理和DFS的非递归解法一样,就是使用一个变量存放从根节点到当前节点的路径,代码如下
public List<String> binaryTreePaths(TreeNode root) { List<String> res = new ArrayList<>(); if (root == null) return res; //队列,节点和路径成对出现,路径就是从根节点到当前节点的路径 Queue<Object> queue = new LinkedList<>(); queue.add(root); queue.add(root.val + ""); while (!queue.isEmpty()) { TreeNode node = (TreeNode) queue.poll(); String path = (String) queue.poll(); //如果到叶子节点,说明找到了一条完整路径 if (node.left == null && node.right == null) { res.add(path); } //右子节点不为空就把右子节点和路径存放到队列中 if (node.right != null) { queue.add(node.right); queue.add(path + "->" + node.right.val); } //左子节点不为空就把左子节点和路径存放到队列中 if (node.left != null) { queue.add(node.left); queue.add(path + "->" + node.left.val); } } return res; }