算法-队列 发表于 2019-04-21 | 分类于 Java , algorithms 树的层序遍历问题从上到下1234567891011121314151617181920212223242526272829303132333435package leetcode.queue;import leetcode.stack.TreeNode;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Queue;/** * Created by cdx0312 * 2018/4/8 */public class BinaryTreeLevelOrderTraversal_102 { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> res = new ArrayList<>(); if (root == null) return res; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { int size = queue.size(); List<Integer> list = new ArrayList<>(); for (int i = 0; i < size; i++) { TreeNode node = queue.poll(); list.add(node.val); if (node.left != null) queue.offer(node.left); if (node.right != null) queue.offer(node.right); } res.add(list); } return res; }} 从下到上123456789101112131415161718192021222324252627282930313233343536package leetcode.queue;import leetcode.stack.TreeNode;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Queue;/** * Created by cdx0312 * 2018/4/8 */public class BinaryTreeLevelOrderTraversalII_107 { public List<List<Integer>> levelOrderBottom(TreeNode root) { List<List<Integer>> res = new ArrayList<>(); if (root == null) return res; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { int size = queue.size(); List<Integer> list = new ArrayList<>(); for (int i = 0; i < size; i++) { TreeNode node = queue.poll(); list.add(node.val); if (node.left != null) queue.offer(node.left); if (node.right != null) queue.offer(node.right); } res.add(0, list); } return res; }} 之字形层序遍历1234567891011121314151617181920212223242526272829303132333435363738394041package leetcode.queue;import leetcode.stack.TreeNode;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Queue;/** * Created by cdx0312 * 2018/4/8 */public class BinaryTreeZigzagLevelOrderTraversal_103 { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> res = new ArrayList<>(); if (root == null) return res; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); int flag = 1; while (!queue.isEmpty()) { int size = queue.size(); List<Integer> list = new ArrayList<>(); for (int i = 0; i < size; i++) { TreeNode node = queue.poll(); if (flag % 2 == 1) list.add(node.val); else list.add(0, node.val); if (node.left != null) queue.offer(node.left); if (node.right != null) queue.offer(node.right); } res.add(list); flag++; } return res; }} 从一颗树右侧看过去的节点数1234567891011121314151617181920212223242526272829303132333435package leetcode.queue;import leetcode.stack.TreeNode;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Queue;/** * Created by cdx0312 * 2018/4/8 */public class BinaryTreeRightSideView_199 { public List<Integer> rightSideView(TreeNode root) { List<Integer> res = new ArrayList<>(); if (root == null) return res; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { int size = queue.size(); for (int i = 0; i < size; i++) { TreeNode node = queue.poll(); if (i == size - 1) res.add(node.val); if (node.left != null) queue.offer(node.left); if (node.right != null) queue.offer(node.right); } } return res; }} 合并k个排序链表, 用优先队列,重写compare方法1234567891011121314151617181920212223242526272829303132333435363738package leetcode.queue;import leetcode.linkedList.ListNode;import java.util.Comparator;import java.util.List;import java.util.PriorityQueue;/** * Created by cdx0312 * 2018/4/8 */public class MergeKSortedLists_23 { public ListNode mergeKLists(ListNode[] lists) { if (lists == null || lists.length == 0) return null; PriorityQueue<ListNode> queue = new PriorityQueue<>(lists.length, new Comparator<ListNode>() { @Override public int compare(ListNode o1, ListNode o2) { return o1.val - o2.val; } }); ListNode dummy = new ListNode(0); ListNode p = dummy; for (ListNode node : lists) { if (node != null) queue.add(node); } while (!queue.isEmpty()) { p.next = queue.poll(); p = p.next; if (p.next != null) queue.add(p.next); } return dummy.next; }} 找到数组中出现频率最高的k个数1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556package leetcode.queue;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.PriorityQueue;/** * Created by cdx0312 * 2018/4/8 */public class TopKFrequentElements_347 { public List<Integer> topKFrequent(int[] nums, int k) { List<Integer> res = new ArrayList<>(); //统计数组中的元素出现的频率,key-num, value-次数 HashMap<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { if (map.containsKey(nums[i])) { map.put(nums[i], map.get(nums[i])+1); } else { map.put(nums[i],1); } } //扫描map,维护当前频率最高的k个元素, PriorityQueue<Pair> queue = new PriorityQueue<>(k); for (Integer i : map.keySet()) { if (queue.size() == k) { if (map.get(i) > queue.peek().freq){ queue.poll(); queue.add(new Pair(map.get(i),i)); } } else { queue.add(new Pair(map.get(i), i)); } } //遍历优先队列,将num加入到结果集中 for (Pair pair : queue) { res.add(0, pair.num); } return res; } class Pair implements Comparable<Pair>{ int freq; int num; public Pair(int freq, int num) { this.freq = freq; this.num = num; } @Override public int compareTo(Pair o) { return this.freq - o.freq; } }} Donate comment here 打赏 微信支付 支付宝 比特币