116.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. 'use strict'
  2. /**
  3. * Definition for binary tree with next pointer.
  4. * function TreeLinkNode(val) {
  5. * this.val = val;
  6. * this.left = this.right = this.next = null;
  7. * }
  8. */
  9. function TreeLinkNode(val) {
  10. this.val = val
  11. this.left = this.right = this.next = null
  12. }
  13. /**
  14. * @param {TreeLinkNode} root
  15. * @return {void} Do not return anything, modify tree in-place instead.
  16. */
  17. // var connect = function (root) {
  18. // if (root === null) {
  19. // return
  20. // }
  21. // let curr = root
  22. // let prev = null
  23. // let queue = []
  24. // queue.push({
  25. // node: curr,
  26. // level: 1
  27. // })
  28. // while (queue.length !== 0) {
  29. // let q = queue[0]
  30. // queue = queue.slice(1)
  31. // if (prev !== null && prev.level === q.level) {
  32. // prev.node.next = q.node
  33. // }
  34. // prev = q
  35. // if (q.node.left !== null) {
  36. // queue.push({
  37. // node: q.node.left,
  38. // level: q.level + 1
  39. // })
  40. // }
  41. // if (q.node.right !== null) {
  42. // queue.push({
  43. // node: q.node.right,
  44. // level: q.level + 1
  45. // })
  46. // }
  47. // }
  48. // }
  49. // It is a FULL BST, so we can use some tricky method
  50. var connect = function(root) {
  51. if (root === null) return
  52. connectHelper(root.left, root.right)
  53. connectHelper(root.right, null)
  54. }
  55. function connectHelper(node, next) {
  56. if (node === null) return
  57. node.next = next
  58. // NOTE: All values are truthy unless they are defined as falsy
  59. // If next === null, && return false, false || null => null;
  60. // else && return next.left, next.left || null => next.left
  61. let nextRight = next && next.left || null
  62. connectHelper(node.left, node.right)
  63. connectHelper(node.right, nextRight)
  64. }
  65. function __main__() {
  66. /*eslint no-console: ["error", { allow: ["log"] }] */
  67. let logger = console.log.bind(console)
  68. // 1
  69. // / \
  70. // 2 3
  71. // /\ /\
  72. // 4 5 6 7
  73. let n7 = new TreeLinkNode(7)
  74. let n6 = new TreeLinkNode(6)
  75. let n5 = new TreeLinkNode(5)
  76. let n4 = new TreeLinkNode(4)
  77. let n3 = new TreeLinkNode(3)
  78. n3.left = n6
  79. n3.right = n7
  80. let n2 = new TreeLinkNode(2)
  81. n2.left = n4
  82. n2.right = n5
  83. let n1 = new TreeLinkNode(1)
  84. n1.left = n2
  85. n1.right = n3
  86. connect(n1)
  87. logger(n1.next)
  88. logger(n2.next)
  89. logger(n4.next)
  90. logger(n5.next)
  91. }
  92. __main__()