初识宽度优先搜索
发布于: 1 小时前
面试常考题目宽度优先搜索的两种实现方式。
以二叉树为例。
https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
单队列实现
public List<List<Integer>> levelOrder(TreeNode root) {
if (root == null) {
return new ArrayList<>();
}
final List<List<Integer>> ret = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);//这里第一步首先要添加root节点
while (!queue.isEmpty()){
int size = queue.size();//这个size要提前计算好。因为如果要动态计算。因为queue会动态的添加中。
final List<Integer> vals = new ArrayList<>();
for (int i = 0;i < size;i++){
TreeNode node = queue.poll();
vals.add(node.val);
if (node.left != null){
queue.offer(node.left);
}
if (node.right != null){
queue.offer(node.right);
}
}
ret.add(vals);
}
return ret;
}
复制代码
两个队列实现
public static List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> results = new ArrayList<>();
if (root == null) {
return results;
}
List<TreeNode> queue = new ArrayList<>();
queue.add(root);//添加root节点
while (!queue.isEmpty()) {
List<TreeNode> nextQ = new ArrayList<>();
results.add(toIntegerList(queue));
for (TreeNode treeNode : queue) {
if (treeNode.left != null) {
nextQ.add(treeNode.left);
}
if (treeNode.right != null) {
nextQ.add(treeNode.right);
}
}
queue = nextQ;//替换成另一个队列。
}
return results;
}
private static List<Integer> toIntegerList(List<TreeNode> queue) {
List<Integer> list = new ArrayList<>();
for (TreeNode treeNode : queue) {
list.add(treeNode.val);
}
return list;
}
复制代码
划线
评论
复制
发布于: 1 小时前阅读数: 4
泽睿
关注
还未添加个人签名 2017.12.22 加入
还未添加个人简介
评论