// å®ä¹èç¹ function Node(key, value) { this.key = key; this.value = value; this.left = null; this.right = null; } /* * å®ä¹äºåæç´¢æ */ module.exports.BST = class BST { constructor() { this.root = null; // æ ¹èç¹ this.count = 0; // èç¹ä¸ªæ° } // åäºåæç´¢æ ç§æå ¥ä¸ä¸ªæ°çæ°æ®å¯¹ insert(key, value) { this.root = this.__insert(this.root, key, value); } // å以nodeä¸ºæ ¹çäºåæç´¢æ ä¸ï¼æå ¥èç¹(key, value),使ç¨éå½ç®æ³ // è¿åæå ¥æ°èç¹åçäºåæç´¢æ çæ ¹ __insert(node, key, value) { if(node === null) { this.count++; return new Node(key, value); } // 妿key卿 ä¸å·²ç»åå¨ï¼åæ´æ°value if(key === node.key) node.value = value; else if(key < node.key) node.left = this.__insert(node.left, key, value); else node.right = this.__insert(node.right, key, value); return node; // è¿å忥çèç¹ } // æ¥çäºåæç´¢æ ç§æ¯å¦åå¨é®key contain(key) { return this.__contain(this.root, key); } // æ¥çnodeä¸ºæ ¹çäºåæç´¢æ ç§æ¯å¦å å«é®å¼ä¸ºkeyçèç¹ï¼ä½¿ç¨éå½ç®æ³ __contain(node, key) { if(node === null) return false; if(key === node.key) return true; else if(key < node.key) return this.__contain(node.left, key); else return this.__contain(node.right, key); } // å¨äºåæç´¢æ ç§æç´¢é®keyæå¯¹åºçå¼ã妿è¿ä¸ªå¼ä¸åå¨è¿ånull search(key) { return this.__search(this.root, key); } // å¨ä»¥nodeä¸ºæ ¹çäºåæç´¢æ ç§ä¸æ¥æ¾keyæå¯¹åºçvalueï¼ä½¿ç¨éå½ç®æ³ __search(node, key) { if(node === null) return null; if(key === node.key) return node.value; else if(key < node.key) return this.__search(node.left, key); else return this.__search(node.right, key); } // äºåæç´¢æ çååºéå,深度ä¼å éå preOrder() { let str = ""; this.__preOrder(this.root, (node) => { str += node.key + " "; }); console.log(str); } // 对以nodeä¸ºæ ¹çäºåæç´¢æ è¿è¡ååºéåï¼éå½ç®æ³ // ä¼ å ¥handle彿°ç¨äºè¾åºæ°æ® __preOrder(node, handle) { if(node !== null) { handle(node); this.__preOrder(node.left, handle); this.__preOrder(node.right, handle); } } // äºåæç´¢æ çä¸åºéå,深度ä¼å éå inOrder() { let str = ""; this.__inOrder(this.root, (node) => { str += node.key + " "; }); console.log(str); } // 对以nodeä¸ºæ ¹çäºåæç´¢æ è¿è¡ä¸åºéåï¼éå½ç®æ³ // ä¼ å ¥handle彿°ç¨äºè¾åºæ°æ® __inOrder(node, handle) { if(node !== null) { this.__inOrder(node.left, handle); handle(node); this.__inOrder(node.right, handle); } } // äºåæç´¢æ çååºéå,深度ä¼å éå postOrder() { let str = ""; this.__postOrder(this.root, (node) => { str += node.key + " "; }); console.log(str); } // 对以nodeä¸ºæ ¹çäºåæç´¢æ è¿è¡ååºéåï¼éå½ç®æ³ // ä¼ å ¥handle彿°ç¨äºè¾åºæ°æ® __postOrder(node, handle) { if(node !== null) { this.__postOrder(node.left, handle); this.__postOrder(node.right, handle); handle(node); } } // äºåæç´¢æ çå±åºéå,广度ä¼å éå levelOrder() { let queue = []; let str = ""; queue.push(this.root); while(queue.length > 0) { let node = queue.shift(); str += node.key + " "; if(node.left) queue.push(node.left); if(node.right) queue.push(node.right); } console.log(str); } // 寻æ¾äºåæç´¢æ çæå°çå¼ minimun() { let node = this.__minimum(this.root); return node.key; } // è¿å以nodeä¸ºæ ¹çäºåæç´¢æ çæå°é®å¼æå¨çèç¹ï¼éå½ç®æ³ __minimum(node) { if(node.left === null) return node; return this.__minimum(node.left); } // 寻æ¾äºåæç´¢æ çæå¤§çå¼ maximun() { let node = this.__maximum(this.root); return node.key; } // è¿å以nodeä¸ºæ ¹çäºåæç´¢æ çæå°é®å¼æå¨çèç¹ï¼éå½ç®æ³ __maximum(node) { if(node.right === null) return node; return this.__maximum(node.right); } // å é¤äºåæç´¢æ 䏿å°å¼æå¨çèç¹ removeMin() { if(this.root) this.root = this.__removeMin(this.root); } // å 餿以nodeä¸ºæ ¹çäºåæç´¢æ ä¸çæå°èç¹ // è¿åå é¤èç¹åçäºåæç´¢æ çæ ¹ __removeMin(node) { if(node.left === null) { let rightNode = node.right; this.count--; return rightNode; } node.left = this.__removeMin(node.left); return node; } // å é¤äºåæç´¢æ 䏿å°å¼æå¨çèç¹ removeMax() { if(this.root) this.root = this.__removeMax(this.root); } // å 餿以nodeä¸ºæ ¹çäºåæç´¢æ ä¸çæå¤§èç¹ // è¿åå é¤èç¹åçäºåæç´¢æ çæ ¹ __removeMax(node) { if(node.right === null) { let leftNode = node.left; this.count--; return leftNode; } node.right = this.__removeMax(node.right); return node; } // ä»äºåæç´¢æ ç§å é¤é®å¼ä¸ºkeyçèç¹ remove(key) { this.root = this.__remove(this.root, key); } // å 餿以nodeä¸ºæ ¹çäºåæç´¢æ ç§é®å¼ä¸ºkeyçèç¹ // è¿åå é¤èç¹åæ°çäºåæç´¢æ çæ ¹ __remove(node, key) { if(node === null) return null; if(key < node.key) { node.left = this.__remove(node.left, key); return node; } else if(key > node.key) { node.right = this.__remove(node.right, key); return node; } else { // å¾ å é¤èç¹å·¦åæ ä¸ºç©ºçæ åµ if(node.left === null) { let rightNode = node.right; this.count--; return rightNode; } // å¾ å é¤èç¹å³åæ ä¸ºç©ºçæ åµ if(node.right === null) { let leftNode = node.left; this.count--; return leftNode; } // å¾ å é¤èç¹å·¦å³åæ åä¸ä¸ºç©ºçæ åµ // æ¾å°æ¯å¾ å é¤èç¹å¤§çæå°èç¹ï¼å³å¾ å é¤èç¹å³åæ çæå°èç¹ // ç¨è¿ä¸ªèç¹æ¿ä»£å é¤èç¹çä½ç½® // è·å¾å¾ å é¤èç¹å³åæ çæå°èç¹ let getRMinNode = this.__minimum(node.right); // å建æ°çèç¹ let successor = new Node(getRMinNode.key, getRMinNode.value); this.count++; successor.right = this.__removeMin(node.right); successor.left = node.left; this.count--; return successor; } } // è¿åäºåæç´¢æ çèç¹ä¸ªæ° size() { return this.count; } // 夿äºåæç´¢æ æ¯å¦ä¸ºç©º isEmpty() { return this.count === 0; } }