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

One platform to build and deploy the best data apps

Experiment and prototype by building visualizations in live JavaScript notebooks. Collaborate with your team and decide which concepts to build out.
Use Observable Framework to build data apps locally. Use data loaders to build in any language or library, including Python, SQL, and R.
Seamlessly deploy to Observable. Test before you ship, use automatic deploy-on-commit, and ensure your projects are always up-to-date.
Learn more