leetcode 865. Smallest Subtree with all the Deepest Nodes | 865.具有所有最深节点的最小子树(树的BFS,parent反向索引map)

x33g5p2x  于2022-07-04 转载在 其他  
字(1.5k)|赞(0)|评价(0)|浏览(290)

题目

https://leetcode.com/problems/smallest-subtree-with-all-the-deepest-nodes/

题解

  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. class Solution {
  17. public TreeNode subtreeWithAllDeepest(TreeNode root) {
  18. // 层序遍历,记录最深层
  19. Queue<TreeNode> preQueue = new LinkedList<>();
  20. Queue<TreeNode> curQueue = new LinkedList<>();
  21. Queue<TreeNode> nextQueue;
  22. curQueue.offer(root);
  23. while (!curQueue.isEmpty()) {
  24. preQueue = new LinkedList<>(curQueue);
  25. nextQueue = new LinkedList<>();
  26. while (!curQueue.isEmpty()) {
  27. TreeNode cur = curQueue.poll();
  28. if (cur.left != null) {
  29. nextQueue.offer(cur.left);
  30. }
  31. if (cur.right != null) {
  32. nextQueue.offer(cur.right);
  33. }
  34. }
  35. if (nextQueue.isEmpty()) {
  36. break;
  37. }
  38. curQueue = nextQueue;
  39. }
  40. // 建立树反向索引表
  41. HashMap<TreeNode, TreeNode> parentMap = new HashMap<>();
  42. dfs(root, parentMap);
  43. // 从最深层每个节点向上找parent,路过时,节点经过次数count++,找到最早出现count==n的祖先
  44. HashMap<Integer, Integer> countMap = new HashMap<>();
  45. int n = preQueue.size();
  46. while (!preQueue.isEmpty()) {
  47. TreeNode cur = preQueue.poll();
  48. while (cur != null) {
  49. int count = countMap.getOrDefault(cur.val, 0) + 1;
  50. if (count == n) {
  51. return cur;
  52. }
  53. countMap.put(cur.val, count);
  54. cur = parentMap.get(cur);
  55. }
  56. }
  57. return null;
  58. }
  59. public void dfs(TreeNode node, HashMap<TreeNode, TreeNode> map) {
  60. if (node.left != null) {
  61. map.put(node.left, node);
  62. dfs(node.left, map);
  63. }
  64. if (node.right != null) {
  65. map.put(node.right, node);
  66. dfs(node.right, map);
  67. }
  68. }
  69. }

相关文章