写点什么

初识宽度优先搜索

用户头像
泽睿
关注
发布于: 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; }
复制代码


用户头像

泽睿

关注

还未添加个人签名 2017.12.22 加入

还未添加个人简介

评论

发布
暂无评论
初识宽度优先搜索