Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.06 KB | None | 0 0
  1. //* Definition for a binary tree node.
  2. function TreeNode(val) {
  3. this.val = val;
  4. this.left = this.right = null;
  5. }
  6.  
  7. /**
  8. * @param {string} S
  9. * @return {TreeNode}
  10. */
  11. class ParentStack {
  12. constructor() {
  13. this.length = 0
  14. this.head = null
  15. }
  16. push(val) {
  17. const node = new ParentNode(val)
  18. if (!this.head) {
  19. this.head = node
  20. } else {
  21. node.next = this.head
  22. this.head = node
  23. }
  24. this.length++
  25. }
  26. pop() {
  27. const node = this.head
  28. this.head = this.head.next
  29. this.length--
  30. return node.val
  31. }
  32. peek() {
  33. if (this.head) {
  34. return this.head.val
  35. } else {
  36. return null
  37. }
  38. }
  39. }
  40.  
  41. class ParentNode {
  42. constructor(val) {
  43. this.val = val
  44. this.next = null
  45. }
  46. }
  47.  
  48. var recoverFromPreorder = function(S) {
  49. var root
  50.  
  51. const DASH = '-'
  52.  
  53. const parentStack = new ParentStack()
  54.  
  55. let i = 0
  56. while (i < S.length) {
  57. let char = S[i]
  58. let dashCount = 0
  59. // count dashes
  60. while (char === DASH && i < S.length) {
  61. dashCount++
  62. i++
  63. char = S[i]
  64. }
  65. // get all digits for int
  66. let charString = ''
  67. // check next chars until dash is found again
  68. while (char >= 0 && char < 10) { // check if char is a number
  69. charString = charString + char
  70. // check next char
  71. i++
  72. char = S[i]
  73. }
  74. // if dash count is greater than parent stack length, throw error
  75. if (dashCount > parentStack.length) {
  76. throw new Error('invalid input')
  77. }
  78. // pop parents to match dash count
  79. while (parentStack.length &&
  80. parentStack.length - dashCount > 0) {
  81. parentStack.pop()
  82. }
  83. // charString should be all digits for integer
  84. // next char will be dash now
  85. // make tree node from next index val
  86. let treeNode = new TreeNode(charString)
  87. // node = parent stack peek
  88. const parent = parentStack.peek()
  89. // if dash count is 0
  90. // and parent stack length is 0
  91. // make root for parent stack
  92. if (dashCount === 0 &&
  93. parentStack.length === 0) {
  94. root = new TreeNode(charString)
  95. parentStack.push(root)
  96. // if node's left has not been assigned
  97. } else if (!parent.left) {
  98. // add as node's left
  99. parent.left = treeNode
  100. // push to parent stack
  101. parentStack.push(treeNode)
  102. } else if (!parent.right) {
  103. // else if node's right has not been assigned
  104. // add as node's right
  105. parent.right = treeNode
  106. // push to parent stack
  107. parentStack.push(treeNode)
  108. } else {
  109. // else this parent has all nodes, check others
  110. parentStack.pop()
  111. i++
  112. continue
  113. }
  114. }
  115.  
  116. return root
  117. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement