Trees
BST Insert
Insert values into a binary search tree by comparing at each node.
Algorithm
Basic Implementation
basic.js
class Node {
constructor(value, left = null, right = null) {
this.value = value;
this.left = left;
this.right = right;
}
}
function render(node) {
if (node === null) return "_";
if (node.left === null && node.right === null) return String(node.value);
return `${node.value}(${render(node.left)},${render(node.right)})`;
}
function sampleTree() {
return new Node(4, new Node(2, new Node(1), new Node(3)), new Node(6, new Node(5), new Node(7)));
}
function insert(root, value) { if (root === null) return new Node(value); if (value < root.value) root.left = insert(root.left, value); else root.right = insert(root.right, value); return root; }
let root = null;
for (const value of [4, 2, 6, 1, 3, 5, 7]) root = insert(root, value);
console.log(render(root));
Complexity
- Time: O(h) per insert
- Space: O(n)
Implementation notes
- Each tree node is a JavaScript
Nodeobject withvalue,left, andrightproperties. Missing children are stored asnull, and inserting into anullslot allocates a new node. insert(root, value)is recursive and returns the subtree root after any mutation. The caller assignsroot = insert(root, value), and recursive frames update references withroot.left = ...orroot.right = ....- Comparisons use numeric
Numberordering. Values smaller thanroot.valuego left; theelsebranch sends greater values, and any duplicate values, to the right. - The replay inserts
4at the root, then2left,6right,1under2.left,3under2.right,5under6.left, and7under6.right, ending with4(2(1,3),6(5,7)). render(root)recursively formats node references instead of printing object identities, andconsole.logprints4(2(1,3),6(5,7)). Heap allocation includes the input literal, the sevenNodeobjects, and the strings created while rendering; the replay also shows sorted inserts forming the unbalanced chain1(_,2(_,3(_,4))).
binary search tree
Values smaller than a node go left; larger values go right.