/* * å®ä¹èç¹ */ function Node(data) { this.data = data; this.left = null; this.right = null; this.show = show; } // è¾åºæ°æ® function show() { return this.data; } /* * å®ä¹äºåæ */ module.exports = function BST() { this.root = null; this.insert = insert; this.insertNode = insertNode; this.preOrderTraversal = preOrderTraversal; this.preOrderTranversalNode = preOrderTranversalNode; this.inOrderTraversal = inOrderTraversal; this.inOrderTraversalNode = inOrderTraversalNode; this.postOrderTraversal = postOrderTraversal; this.postOrderTraversalNode = postOrderTraversalNode; this.getMin = getMin; this.getMax = getMax; this.search = search; this.remove = remove; this.getSuccessor = getSuccessor; } // æå ¥æ°æ® function insert(data) { // æ ¹æ®dataå建对åºçnode var newNode = new Node(data); // å¤ææ ¹èç¹æ¯å¦æå¼ if (this.root === null) { this.root = newNode; } else { // æå ¥è¯¥èç¹ this.insertNode(this.root, newNode); } } // 夿æå ¥èç¹ä½ç½®ï¼å¹¶æå ¥è¯¥æ°æ® function insertNode(node, newNode) { // 夿èç¹æå ¥ä½ç½® // é¦å 夿æ¯å¦å°äºè¯¥èç¹çå¼ if (newNode.data < node.data) { // å¦æè¯¥èç¹æ²¡æå·¦åæ if (node.left === null) { node.left = newNode; } else { // 该èç¹å·¦åæ è¿æèç¹ï¼è¿è¡éå½å¤æ this.insertNode(node.left, newNode); } } else { // åå¤åå³åæ æå ¥æ°æ® if (node.right === null) { // nodeçå³åæ 䏿²¡æå 容 node.right = newNode; } else { // 该èç¹å³åæ è¿æèç¹ï¼è¿è¡éå½å¤æ this.insertNode(node.right, newNode); } } } // éåæ¹æ³ // å åºéå // handlerä¸ºæ°æ®å±ç¤ºçæ¹å¼ function preOrderTraversal(handler) { this.preOrderTranversalNode(this.root, handler); } function preOrderTranversalNode(node, handler) { if (node !== null) { handler(node.data); this.preOrderTranversalNode(node.left, handler); this.preOrderTranversalNode(node.right, handler); } } // ä¸åºéå function inOrderTraversal(handler) { this.inOrderTraversalNode(this.root, handler); } function inOrderTraversalNode(node, handler) { if (node !== null) { this.inOrderTraversalNode(node.left, handler); handler(node.data); this.inOrderTraversalNode(node.right, handler); } } // åç»éå function postOrderTraversal(handler) { this.postOrderTraversalNode(this.root, handler); } function postOrderTraversalNode(node, handler) { if (node !== null) { this.postOrderTraversalNode(node.left, handler); this.postOrderTraversalNode(node.right, handler); handler(node.data); } } // è·åæå¤§å¼åæå°å¼ function getMin() { var node = this.root; while (node.left !== null) { node = node.left; } return node.data; } function getMax() { var node = this.root; while (node.right !== null) { node = node.right; } return node.data; } // æç´¢å¼ /* function search(data) { return this.searchNode(this.root, data); } // éå½çåæ³ function searchNode(node, data) { // å¦æä¼ å ¥çnode为null,é£ä¹å°±éåºéå½ if (node === null) { return false; } // 夿nodeèç¹çå¼åä¼ å ¥çdataå¤§å° if (node.data > data) { // ä¼ å ¥çdataè¾å°, åå·¦è¾¹ç»§ç»æ¥æ¾ return this.searchNode(node.left, data); } else if (node.data < data) { // ä¼ å ¥çdataè¾å¤§, åå³è¾¹ç»§ç»æ¥æ¾ return this.searchNode(node.right, data) } else { // ç¸å, è¯´ææ¾å°äºdata return true } } */ function search(data) { var node = this.root; while (node !== null) { if (node.data > data) { node = node.left; } else if (node.data < data) { node = node.right; } else { return true; } } return false; } // å é¤èç¹ function remove(data) { // å®ä¹ä¸´æ¶ä¿åçåé var current = this.root; var parent = this.root; var isLeftChild = true; // å¼å§æ¥æ¾èç¹ while (current.data !== data) { parent = current; if (data < current.data) { isLeftChild = true; current = current.left; } else { isLeftChild = false; current = current.right; } // 妿åç°currentå·²ç»æånull, é£ä¹è¯´ææ²¡ææ¾å°è¦å é¤çæ°æ® if (current === null) return false; } // å é¤çç»ç¹æ¯å¶ç»ç¹ if (current.left === null && current.right === null) { if (current == this.root) { this.root == null; } else if (isLeftChild) { // 妿æ¯å·¦åæ ï¼åç½®å·¦åæ ä¸ºnull parent.left = null; } else { parent.right = null; } } // å 餿ä¸ä¸ªåèç¹çèç¹ else if (current.right === null) { if (current == this.root) { this.root = current.left; } else if (isLeftChild) { // 妿æ¯å·¦åæ ï¼åå°ç¶æ çå·¦åæ æååæ çåæ parent.left = current.left; } else { parent.right = current.left; } } else if (current.left === null) { if (current == this.root) { this.root = current.right; } else if (isLeftChild) { parent.left = current.right; } else { parent.right = current.right; } } // å é¤æä¸¤ä¸ªèç¹çèç¹ else { // è·ååç»§èç¹ var successor = this.getSuccessor(current); // 夿æ¯å¦æ¯æ ¹èç¹ if (current == this.root) { this.root = successor; } else if (isLeftChild) { parent.left = successor; } else { parent.right = successor; } // å°å é¤èç¹çå·¦åæ èµå¼ç»successor successor.left = current.left; } return true; } // æ¾åç»§çæ¹æ³ function getSuccessor(delNode) { // 使ç¨åéä¿å临æ¶çèç¹ var successorParent = delNode; // åç»§èç¹çç¶èç¹ var successor = delNode; // åç»§èç¹ var current = delNode.right; // è¦ä»å³åæ å¼å§æ¾ // 寻æ¾èç¹ while (current !== null) { successorParent = successor; successor = current; // åå·¦æ¥æ¾ current = current.left; } // 妿åç»§ç³»èç¹ä¸çäºå é¤èç¹çå³èç¹ // æ¿æ¢èç¹ï¼æåç»§èç¹çå³åæ èµç»å ¶ç¶èç¹å·¦åæ // åç»§èç¹çå³åæ åæå é¤èç¹çå³åæ if (successor != delNode.right) { successorParent.left = successor.right; successor.right = delNode.right; } return successor; }