class BinaryTree { static Node = key => { return { key, left: null, right: null } }
static traverseNodesLDR(node, callback) { if (node !== null) { BinaryTree.traverseNodesLDR(node.left, callback); callback?.(node); BinaryTree.traverseNodesLDR(node.right, callback) } }
static traverseNodesLDRforWhile(node, callback) { const stack = []; let currentNode = node;
while (stack.length || currentNode) { if (currentNode) { stack.push(currentNode); currentNode = currentNode.left; } else { currentNode = stack.pop(); callback?.(currentNode) currentNode = currentNode.right; } } }
static traverseNodesDLR(node, callback) { if (node !== null) { callback?.(node); BinaryTree.traverseNodesDLR(node.left, callback); BinaryTree.traverseNodesDLR(node.right, callback); } }
static traverseNodesDLRforWhile(node, callback) { let currentNode = node; const stack = [currentNode];
while (stack.length) { currentNode = stack.pop(); callback?.(currentNode); if (currentNode.right) stack.push(currentNode.right); if (currentNode.left) stack.push(currentNode.left); } }
static traverseNodesLRD(node, callback) { if (node !== null) { BinaryTree.traverseNodesLRD(node.left, callback); BinaryTree.traverseNodesLRD(node.right, callback); callback?.(node); } }
static traverseNodesLRDForWhile(node, callback) { let currentNode = node; const stack = [currentNode]; let fNode = null;
while (stack.length) { fNode = stack[stack.length - 1]; if (fNode.left && currentNode !== fNode.left && currentNode !== fNode.right) { stack.push(fNode.left); } else if (fNode.right && currentNode !== fNode.right) { stack.push(fNode.right) } else { callback?.(stack.pop()); currentNode = fNode; } } }
constructor({data = []} = {}) { this.root = null; if (data.length) { data.forEach(key => { this.insertNode(key); }) } }
insertNode(key) { const node = BinaryTree.Node(key); if (this.root === null) { this.root = node; } else { this.insertNodeInTree(this.root, node) } }
insertNodeInTree(node, newNode) { if (newNode.key > node.key) { if (node.right === null) { node.right = newNode } else { this.insertNodeInTree(node.right, newNode); } } else { if (node.left === null) { node.left = newNode } else { this.insertNodeInTree(node.left, newNode); } } }
LDR(callback) { BinaryTree.traverseNodesLDRforWhile(this.root, callback) }
DLR(callback) { BinaryTree.traverseNodesDLRforWhile(this.root, callback) }
LRD(callback) { BinaryTree.traverseNodesLRDForWhile(this.root, callback); }
getMaxValue(callback) { this.traverseRightForWhile(this.root, callback) }
getMinValue(callback) { return this.traverseLeft(this.root, callback) }
traverseRight(node, callback) { if (node !== null) { if (node.right !== null) { this.traverseRight(node.right, callback); } else callback?.(node) } else { callback?.('xxxx') } }
traverseRightForWhile(node, callback) { let currentNode = node;
while (currentNode) { if (currentNode.right) currentNode = currentNode.right; else { callback?.(currentNode); currentNode = null; } } }
traverseLeft(node, callback) { !callback && console.log(node, 'node'); if (node !== null) { if (node.left !== null) { if (callback) this.traverseLeft(node.left, callback); else return this.traverseLeft(node.left, callback); } else { if (callback) callback?.(node) else return node } } else callback?.('xxxx') }
findNode(targetKey) { return this.traverseNodeForWhile(this.root, targetKey); }
traverseNode(node, targetKey) { if (node !== null) { if (targetKey > node.key) { return this.traverseNode(node.right, targetKey); } else if (targetKey < node.key) { return this.traverseNode(node.left, targetKey); } else { return node; } } }
traverseNodeForWhile(node, targetKey) { let currentNode = node; let resultNode = null;
while (currentNode) { if (targetKey > currentNode.key) currentNode = currentNode.right; else if (targetKey < currentNode.key) currentNode = currentNode.left; else { resultNode = currentNode; currentNode = null; } }
return resultNode; }
removeNode(key) { this.removeNodeByKey(this.root, key) }
removeNodeByKey(node, key) { if (node === null) return node; if (key > node.key) { node.right = this.removeNodeByKey(node.right, key); return node; } else if (key < node.key) { node.left = this.removeNodeByKey(node.left, key); return node; } if (node.left === null && node.right === null) { return node = null } if (node.left === null) { return node = node.right; }
if (node.right === null) { return node = node.left; }
const minValue = this.traverseLeft(node.right) node.key = minValue.key; node.right = this.removeNodeByKey(node.right, minValue.key) return node } }
const data = [6, 2, 3, 4, 9, 8, 7, 12, 1, 22, 21, 11]; const tree = new BinaryTree({data}); console.log(tree);
tree.LDR(function (node) { });
tree.DLR(function (node) { });
tree.LRD(function (node) { });
tree.getMaxValue(function (node) { })
tree.getMinValue(function (node) { })
const target = tree.findNode(22);
console.log(tree.removeNode(9));
|