Public
Edited
Jul 21, 2024
Insert cell
Insert cell
tree = (function() {
return {
"a": {
"b": {
"e": {},
"f": {
"j": {
"o": {},
"p": {}
},
"k": {
"q": {
"w": {}
}
}
},
"g": {}
},
"c": {},
"d": {
"h": {
"l": {
"r": {},
"s": {},
"t": {
"x": {},
"y": {}
}
},
"m": {}
},
"i": {
"n": {
"u": {},
"v": {
"z": {}
}
}
}
}
}
}
})()
Insert cell
function traversePre() {
const visited = []
function visit(name, obj) {
visited.push(name)
for (let key in obj) {
visit(key, obj[key])
}
}
visit('a', tree.a)
return visited.join('');
}
Insert cell
traversePre()
Insert cell
traversePre().length
Insert cell
function traversePost() {
const visited = []
function visit(name, obj) {
for (let key in obj) {
visit(key, obj[key])
}
visited.push(name)
}
visit('a', tree.a)
return visited.join('');
}
Insert cell
traversePost()
Insert cell
traversePost().length
Insert cell
function traversePreReverse() {
const visited = []
function visit(name, object) {
visited.push(name)
const children = Object.keys(object).reverse()
for (let key of children) {
visit(key, object[key])
}
}
visit('a', tree.a)
return visited.join('');
}
Insert cell
traversePreReverse()
Insert cell
function traversePostReverse() {
const visited = []
function visit(name, object) {
const children = Object.keys(object).reverse()
for (let key of children) {
visit(key, object[key])
}
visited.push(name)
}
visit('a', tree.a)
return visited.join('');
}
Insert cell
traversePostReverse()
Insert cell
function traverseL() {
const visited = []
const stack = [['a', tree.a]]
let current

while (current = stack.pop()) {
const [name, obj] = current
visited.push(name)
for (let key in obj) {
stack.push([key, obj[key]])
}
}
return visited.join('');
}
Insert cell
traverseL(tree)
Insert cell
function traverseR() {
const visited = []
const stack = [['a', tree.a]]
let current

while (current = stack.pop()) {
const [name, obj] = current
visited.push(name)

const children = Object.keys(obj).reverse()
for (let key of children) {
stack.push([key, obj[key]])
}
}
return visited.join('');
}
Insert cell
traverseR(tree)
Insert cell
function traverseBreadth() {
const visited = []
const queue = [['a', tree.a]]
let current
while (current = queue.shift()) {
const [name, obj] = current
visited.push(name)
for (let key in obj) {
queue.push([key, obj[key]])
}
}
return visited.join('');
}
Insert cell
traverseBreadth(tree)
Insert cell
Insert cell
MAP = `
#################
# & #
## ##############
# #
# ##### ### ####
# #
######## ########
# @ #
#################
`.split('\n').slice(1,-1);
Insert cell
DIRS = [
[0, 1], // right
[1, 0], // down
[-1, 0], // left
[0, -1], // up
];
Insert cell
function move([i, j], [di, dj]) {
return [i + di, j + dj];
}
Insert cell
on = ([i, j], [i2, j2]) =>
i == i2 && j == j2
Insert cell
char = ([i, j]) => MAP[i][j];
Insert cell
isWall = (p) => char(p) == "#";
Insert cell
function findPathB(origin, dest) {
let found = false;
let visited = {};
const isDest = (p) => on(p, dest);
const isOrigin = (p) => on(p, origin);
let queue = [[origin, null]];
let current, prev;
while (([current, prev] = queue.shift())) {
visited[current] = prev;
if (isDest(current)) break;
for (let dir of DIRS) {
let next = move(current, dir);
if (isWall(next)) continue;
if (visited[next]) continue;
queue.push([next, current]);
}
}
function assemblePath() {
let p = dest;
const res = [p];
while ((p = visited[p])) {
if (isOrigin(p)) break;
res.push(p);
}
return res;
}
return assemblePath().reverse();
}
Insert cell
findPathB([7,10], [1,5])
Insert cell
findPathB([7,10], [3,15])
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more