算法题

109. 有序链表转换二叉搜索树

给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。

示例 1:

输入: head = [-10,-3,0,5,9]
输出: [0,-3,9,-10,null,5]
解释: 一个可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜索树。
示例 2:

输入: head = []
输出: []

提示:

head 中的节点数在[0, 2 * 104] 范围内
-105 <= Node.val <= 105

  1. var sortedListToBST = function(head) {
  2. if (head == null) return null
  3. // 用快慢指针找到中间节点
  4. var slow = head
  5. var fast = head
  6. var preSlow
  7. while(fast && fast.next) {
  8. // 为了左右断开,需要有保存前一个结点
  9. preSlow = slow
  10. slow = slow.next
  11. fast = fast.next.next
  12. }
  13. var root = new TreeNode(slow.val)
  14. if (preSlow != null) {
  15. preSlow.next = null
  16. root.left = sortedListToBST(head)
  17. }
  18. root.right = sortedListToBST(slow.next)
  19. return root
  20. };

题解:
https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/solution/shou-hua-tu-jie-san-chong-jie-fa-jie-zhu-shu-zu-ku/

手写题

  1. 实现一个Event Emitter ```javascript Node.js中有Event Emitter,Facebook 也曾经有自己的实现 不过已经archive了。

请实现你自己的 Event Emitter

const emitter = new Emitter() 它需要支持事件订阅

const sub1 = emitter.subscribe(‘event1’, callback1) const sub2 = emitter.subscribe(‘event2’, callback2)

// 同一个callback可以重复订阅同一个事件 const sub3 = emitter.subscribe(‘event1’, callback1) emit(eventName, …args) 可以用来触发callback

emitter.emit(‘event1’, 1, 2); // callback1 会被调用两次 subscribe()返回一个含有release()的对象,可以用来取消订阅。

sub1.release() sub3.release() // 现在即使’event1’被触发, // callback1 也不会被调用

  1. ```javascript
  2. // please complete the implementation
  3. class EventEmitter {
  4. constructor() {
  5. this.eventMap = {}
  6. }
  7. subscribe(eventName, callback) {
  8. if (this.eventMap[eventName] && this.eventMap[eventName].length) {
  9. this.eventMap[eventName].push(callback)
  10. } else {
  11. this.eventMap[eventName] = [callback]
  12. }
  13. let len = this.eventMap[eventName].length - 1
  14. return {
  15. release: () => {
  16. this.eventMap[eventName].splice(len, 1)
  17. }
  18. }
  19. }
  20. emit(eventName, ...args) {
  21. if (this.eventMap[eventName]) {
  22. this.eventMap[eventName].forEach((callback) => {
  23. callback.call(this, ...args)
  24. })
  25. }
  26. }
  27. }