算法题:
- 链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree/
- 题目描述: ```javascript 给定一个单链表的头节点 head ,其中的元素 按升序排序 ,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差不超过 1。 示例: 输入: head = [-10,-3,0,5,9] 输出: [0,-3,9,-10,null,5] 解释: 一个可能的答案是[0,-3,9,-10,null,5],它表示所示的高度平衡的二叉搜索树。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/convert-sorted-list-to-binary-search-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
- 解题
```javascript
var sortedListToBST = function(head) {
if (head == null) return null;
let slow = head
let fast = head
let pre ;
while(fast && fast.next) {
pre = slow
slow = slow.next
fast = fast.next.next
}
let root = new TreeNode(slow.val)
if (pre != null ) {
pre.next = null
root.left= sortedListToBST(head)
}
root.right = sortedListToBST(slow.next);
return root
}
遇到的问题
链接:https://bigfrontend.dev/zh/problem/create-an-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 也不会被调用
- 解题
```javascript
class EventEmitter {
constructor() {
this.eventList = new Map()
}
subscribe(eventName, callback) {
if (!this.eventList.has(eventName)) {
this.eventList.set(eventName,new Set())
}
const eventList = this.eventList.get(eventName)
const callbackObj = {callback}
eventList.add(callbackObj)
return {
release:()=> {
eventList.delete(callbackObj)
if (eventList.size === 0) {
delete this.eventList.eventName
}
}
}
}
emit(eventName, ...args) {
let callbacks = this.eventList.get(eventName)
if (callbacks) {
callbacks.forEach(item =>{
item.callback.apply(null,args)
})
}
}
}
- 遇到的问题
- 一开始没想到用Map 和Set 存储数据
- Set 添加值的时候,是直接添加的,并没有注意到相同的值添加不进去
- 对于sub1.release()返回值的方法进行调用是懵逼的,一开始并不知道可以这样写
- 有待加强