138 lines
3.1 KiB
Plaintext
138 lines
3.1 KiB
Plaintext
// tree_ops.cm — Tree data structure operations kernel
|
|
// Pointer chasing, recursion, allocation patterns.
|
|
|
|
// Binary tree: create, walk, transform, check
|
|
function make_tree(depth) {
|
|
if (depth <= 0) return {val: 1, left: null, right: null}
|
|
return {
|
|
val: depth,
|
|
left: make_tree(depth - 1),
|
|
right: make_tree(depth - 1)
|
|
}
|
|
}
|
|
|
|
function tree_check(node) {
|
|
if (!node) return 0
|
|
if (!node.left) return node.val
|
|
return node.val + tree_check(node.left) - tree_check(node.right)
|
|
}
|
|
|
|
function tree_sum(node) {
|
|
if (!node) return 0
|
|
return node.val + tree_sum(node.left) + tree_sum(node.right)
|
|
}
|
|
|
|
function tree_depth(node) {
|
|
if (!node) return 0
|
|
var l = tree_depth(node.left)
|
|
var r = tree_depth(node.right)
|
|
return 1 + (l > r ? l : r)
|
|
}
|
|
|
|
function tree_count(node) {
|
|
if (!node) return 0
|
|
return 1 + tree_count(node.left) + tree_count(node.right)
|
|
}
|
|
|
|
// Transform tree: map values
|
|
function tree_map(node, fn) {
|
|
if (!node) return null
|
|
return {
|
|
val: fn(node.val),
|
|
left: tree_map(node.left, fn),
|
|
right: tree_map(node.right, fn)
|
|
}
|
|
}
|
|
|
|
// Flatten tree to array (in-order)
|
|
function tree_flatten(node, result) {
|
|
if (!node) return null
|
|
tree_flatten(node.left, result)
|
|
push(result, node.val)
|
|
tree_flatten(node.right, result)
|
|
return null
|
|
}
|
|
|
|
// Build sorted tree from array (balanced)
|
|
function build_balanced(arr, lo, hi) {
|
|
if (lo > hi) return null
|
|
var mid = floor((lo + hi) / 2)
|
|
return {
|
|
val: arr[mid],
|
|
left: build_balanced(arr, lo, mid - 1),
|
|
right: build_balanced(arr, mid + 1, hi)
|
|
}
|
|
}
|
|
|
|
// Find a value in BST
|
|
function bst_find(node, val) {
|
|
if (!node) return false
|
|
if (val == node.val) return true
|
|
if (val < node.val) return bst_find(node.left, val)
|
|
return bst_find(node.right, val)
|
|
}
|
|
|
|
return {
|
|
// Binary tree create + check (allocation heavy)
|
|
tree_create_check: function(n) {
|
|
var i = 0
|
|
var t = null
|
|
var x = 0
|
|
for (i = 0; i < n; i++) {
|
|
t = make_tree(10)
|
|
x += tree_check(t)
|
|
}
|
|
return x
|
|
},
|
|
|
|
// Deep tree traversals
|
|
tree_traversal: function(n) {
|
|
var t = make_tree(12)
|
|
var x = 0
|
|
var i = 0
|
|
for (i = 0; i < n; i++) {
|
|
x += tree_sum(t) + tree_depth(t) + tree_count(t)
|
|
}
|
|
return x
|
|
},
|
|
|
|
// Tree map (create new tree from old)
|
|
tree_transform: function(n) {
|
|
var t = make_tree(10)
|
|
var i = 0
|
|
var mapped = null
|
|
for (i = 0; i < n; i++) {
|
|
mapped = tree_map(t, function(v) { return v * 2 + 1 })
|
|
}
|
|
return mapped
|
|
},
|
|
|
|
// Flatten + rebuild (array <-> tree conversion)
|
|
tree_flatten_rebuild: function(n) {
|
|
var t = make_tree(10)
|
|
var i = 0
|
|
var flat = null
|
|
var rebuilt = null
|
|
for (i = 0; i < n; i++) {
|
|
flat = []
|
|
tree_flatten(t, flat)
|
|
rebuilt = build_balanced(flat, 0, length(flat) - 1)
|
|
}
|
|
return rebuilt
|
|
},
|
|
|
|
// BST search (pointer chasing)
|
|
bst_search: function(n) {
|
|
// Build a balanced BST of 1024 elements
|
|
var data = []
|
|
var i = 0
|
|
for (i = 0; i < 1024; i++) push(data, i)
|
|
var bst = build_balanced(data, 0, 1023)
|
|
var found = 0
|
|
for (i = 0; i < n; i++) {
|
|
if (bst_find(bst, i % 1024)) found++
|
|
}
|
|
return found
|
|
}
|
|
}
|