题目

类型:DFS、BFS、二叉树
image.png

解题思路

1、BFS需要用到层序遍历的代码框架

  1. // 输入一棵二叉树的根节点,层序遍历这棵二叉树
  2. void levelTraverse(TreeNode root) {
  3. if (root == null) return;
  4. Queue<TreeNode> q = new LinkedList<>();
  5. q.offer(root);
  6. // 从上到下遍历二叉树的每一层
  7. while (!q.isEmpty()) {
  8. int sz = q.size();
  9. // 从左到右遍历每一层的每个节点
  10. for (int i = 0; i < sz; i++) {
  11. TreeNode cur = q.poll();
  12. // 将下一层节点放入队列
  13. if (cur.left != null) {
  14. q.offer(cur.left);
  15. }
  16. if (cur.right != null) {
  17. q.offer(cur.right);
  18. }
  19. }
  20. }
  21. }

2、DFS还是分解问题即可

代码

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. /**
  17. * 515. 在每个树行中找最大值
  18. */
  19. public class FindLargestValueInEachTreeRow {
  20. //---------------------------------BFS版本---------------------------------
  21. public List<Integer> largestValues(TreeNode root) {
  22. List<Integer> res = new LinkedList<>();
  23. if (root == null) {
  24. return res;
  25. }
  26. Queue<TreeNode> q = new LinkedList<>();
  27. q.offer(root);
  28. // while 循环控制从上向下一层层遍历
  29. while (!q.isEmpty()) {
  30. int sz = q.size();
  31. // 记录这一层的最大值
  32. int levelMax = Integer.MIN_VALUE;
  33. // for 循环控制每一层从左向右遍历
  34. for (int i = 0; i < sz; i++) {
  35. TreeNode cur = q.poll();
  36. levelMax = Math.max(levelMax, cur.val);
  37. if (cur.left != null)
  38. q.offer(cur.left);
  39. if (cur.right != null)
  40. q.offer(cur.right);
  41. }
  42. res.add(levelMax);
  43. }
  44. return res;
  45. }
  46. //---------------------------------DFS版本---------------------------------
  47. ArrayList<Integer> res = new ArrayList<>();
  48. public List<Integer> largestValuesDFS(TreeNode root) {
  49. if (root == null) {
  50. return res;
  51. }
  52. traverse(root, 0);
  53. return res;
  54. }
  55. // 遍历二叉树
  56. public void traverse(TreeNode root, int depth) {
  57. if (root == null) {
  58. return;
  59. }
  60. if (res.size() <= depth) {
  61. res.add(root.val);
  62. } else {
  63. // 记录当前行的最大值
  64. res.set(depth, Math.max(res.get(depth), root.val));
  65. }
  66. traverse(root.left, depth + 1);
  67. traverse(root.right, depth + 1);
  68. }
  69. }