1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
| class BinarySearchTree { constructor() { this.root = null }
insert(key) { const node = new Node(key) if (this.root == null) { this.root = node } else { insertNode(this.root, node) }
function insertNode(parent, node) { if (parent.key > node.key) { if (parent.left == null) { parent.left = node } else { insertNode(parent.left, node) } } else { if (parent.right == null) { parent.right = node } else { insertNode(parent.right, node) } } } }
inOrderTraverse() { inOrderTraverse(this.root)
function inOrderTraverse(node) { if (node) { inOrderTraverse(node.left) print(node.key) inOrderTraverse(node.right) } } }
preOrderTraverse() { preOrderTraverse(this.root)
function preOrderTraverse(node) { print(node.key) preOrderTraverse(node.left) preOrderTraverse(node.right) } }
postOrderTraverse() { postOrderTraverse(this.root)
function postOrderTraverse(node) { postOrderTraverse(node.left) postOrderTraverse(node.right) print(node.key) } }
max() { let maxNode = {}
function getMax(node) { if (node && node.right) { maxNode = node getMax(node.right) } } getMax(this.root) return maxNode.key }
min() { let minNode = {}
function getMin(node) { if (node && node.left) { minNode = node getMin(node.left) } } getMin(this.root) return minNode.key }
search(key) { function findNode(node) { if (!node) return false if (key > node.key) { return findNode(node.right) } else if (key < node.key) { return findNode(node.left) } return node } return findNode(this.root) }
remove(key) { if (!this.search(key)) return
function adjustNode(current, key) { if (key < current.key) { current.left = adjustNode(current.left, key) return current } else if (key > current.key) { current.right = adjustNode(current.right, key) return current } else { if (current.left === null && current.right === null) { return (current = null) } else if (current.right === null) { let temp = current.left current = null return temp } else if (current.left === null) { let temp = current.right current = null return temp }
current.key = minNode(current.right)
current.right = adjustNode(current.right, current.key)
return current } } function minNode(node) { if (node.left) return minNode(node.left) return node } adjustNode(this.root, key) } }
|