From 4ad63d1ed7b94c118b8a62ebcdeb8698282baaf7 Mon Sep 17 00:00:00 2001 From: Miorel-Lucian Palii Date: Wed, 10 Jul 2024 13:29:55 -0700 Subject: [PATCH 1/2] Add TypeScript goodies for traversing binary trees Tested on Leetcode: * Preorder: https://leetcode.com/problems/binary-tree-preorder-traversal/submissions/1316869104/ * Inorder: https://leetcode.com/problems/binary-tree-inorder-traversal/submissions/1316866526/ * Postorder: https://leetcode.com/problems/binary-tree-postorder-traversal/submissions/1316867885/ --- .../typescript/traverseInorder/index.ts | 15 ++ .../typescript/traversePostorder/index.ts | 15 ++ .../typescript/traversePreorder/index.ts | 12 ++ .../__snapshots__/equip-test.ts.snap | 132 ++++++++++++++++++ .../__snapshots__/render-test.ts.snap | 96 +++++++++++++ 5 files changed, 270 insertions(+) create mode 100644 tools/adventure-pack/goodies/typescript/traverseInorder/index.ts create mode 100644 tools/adventure-pack/goodies/typescript/traversePostorder/index.ts create mode 100644 tools/adventure-pack/goodies/typescript/traversePreorder/index.ts diff --git a/tools/adventure-pack/goodies/typescript/traverseInorder/index.ts b/tools/adventure-pack/goodies/typescript/traverseInorder/index.ts new file mode 100644 index 00000000..84f3f536 --- /dev/null +++ b/tools/adventure-pack/goodies/typescript/traverseInorder/index.ts @@ -0,0 +1,15 @@ +export function* traverseInorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack: [T | null | undefined, boolean][] = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseChildren] = stack.pop()!; + if (node) { + if (didTraverseChildren) { + yield node; + } else { + stack.push([node.right, false], [node, true], [node.left, false]); + } + } + } +} diff --git a/tools/adventure-pack/goodies/typescript/traversePostorder/index.ts b/tools/adventure-pack/goodies/typescript/traversePostorder/index.ts new file mode 100644 index 00000000..d00dfcb8 --- /dev/null +++ b/tools/adventure-pack/goodies/typescript/traversePostorder/index.ts @@ -0,0 +1,15 @@ +export function* traversePostorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack: [T | null | undefined, boolean][] = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseChildren] = stack.pop()!; + if (node) { + if (didTraverseChildren) { + yield node; + } else { + stack.push([node, true], [node.right, false], [node.left, false]); + } + } + } +} diff --git a/tools/adventure-pack/goodies/typescript/traversePreorder/index.ts b/tools/adventure-pack/goodies/typescript/traversePreorder/index.ts new file mode 100644 index 00000000..de92dc7b --- /dev/null +++ b/tools/adventure-pack/goodies/typescript/traversePreorder/index.ts @@ -0,0 +1,12 @@ +export function* traversePreorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack = [root]; + while (stack.length > 0) { + const node = stack.pop(); + if (node) { + yield node; + stack.push(node.right, node.left); + } + } +} diff --git a/tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap b/tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap index 02abc76f..fe32bdd0 100644 --- a/tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap +++ b/tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap @@ -827,6 +827,69 @@ function compareNatural(a, b) { /////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" `; +exports[`App can equip single goody: JavaScript traverseInorder 1`] = ` +"////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// +// Adventure Pack commit fake-commit-hash +// Running at: https://example.com/ + +function* traverseInorder(root) { + const stack = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseChildren] = stack.pop(); + if (node) { + if (didTraverseChildren) { + yield node; + } else { + stack.push([node.right, false], [node, true], [node.left, false]); + } + } + } +} + +/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" +`; + +exports[`App can equip single goody: JavaScript traversePostorder 1`] = ` +"////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// +// Adventure Pack commit fake-commit-hash +// Running at: https://example.com/ + +function* traversePostorder(root) { + const stack = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseChildren] = stack.pop(); + if (node) { + if (didTraverseChildren) { + yield node; + } else { + stack.push([node, true], [node.right, false], [node.left, false]); + } + } + } +} + +/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" +`; + +exports[`App can equip single goody: JavaScript traversePreorder 1`] = ` +"////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// +// Adventure Pack commit fake-commit-hash +// Running at: https://example.com/ + +function* traversePreorder(root) { + const stack = [root]; + while (stack.length > 0) { + const node = stack.pop(); + if (node) { + yield node; + stack.push(node.right, node.left); + } + } +} + +/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" +`; + exports[`App can equip single goody: Kotlin gcd(Int,Int) 1`] = ` "////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// // Adventure Pack commit fake-commit-hash @@ -1956,3 +2019,72 @@ function compareNatural(a: T, b: T): number { /////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" `; + +exports[`App can equip single goody: TypeScript traverseInorder 1`] = ` +"////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// +// Adventure Pack commit fake-commit-hash +// Running at: https://example.com/ + +function* traverseInorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack: [T | null | undefined, boolean][] = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseChildren] = stack.pop()!; + if (node) { + if (didTraverseChildren) { + yield node; + } else { + stack.push([node.right, false], [node, true], [node.left, false]); + } + } + } +} + +/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" +`; + +exports[`App can equip single goody: TypeScript traversePostorder 1`] = ` +"////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// +// Adventure Pack commit fake-commit-hash +// Running at: https://example.com/ + +function* traversePostorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack: [T | null | undefined, boolean][] = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseChildren] = stack.pop()!; + if (node) { + if (didTraverseChildren) { + yield node; + } else { + stack.push([node, true], [node.right, false], [node.left, false]); + } + } + } +} + +/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" +`; + +exports[`App can equip single goody: TypeScript traversePreorder 1`] = ` +"////////////////////////// BEGIN ADVENTURE PACK CODE /////////////////////////// +// Adventure Pack commit fake-commit-hash +// Running at: https://example.com/ + +function* traversePreorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack = [root]; + while (stack.length > 0) { + const node = stack.pop(); + if (node) { + yield node; + stack.push(node.right, node.left); + } + } +} + +/////////////////////////// END ADVENTURE PACK CODE ////////////////////////////" +`; diff --git a/tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap b/tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap index dca3b7ef..a186087e 100644 --- a/tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap +++ b/tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap @@ -507,6 +507,51 @@ exports[`App can render goody: JavaScript compareNatural 1`] = ` }" `; +exports[`App can render goody: JavaScript traverseInorder 1`] = ` +"export function* traverseInorder(root) { + const stack = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseChildren] = stack.pop(); + if (node) { + if (didTraverseChildren) { + yield node; + } else { + stack.push([node.right, false], [node, true], [node.left, false]); + } + } + } +}" +`; + +exports[`App can render goody: JavaScript traversePostorder 1`] = ` +"export function* traversePostorder(root) { + const stack = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseChildren] = stack.pop(); + if (node) { + if (didTraverseChildren) { + yield node; + } else { + stack.push([node, true], [node.right, false], [node.left, false]); + } + } + } +}" +`; + +exports[`App can render goody: JavaScript traversePreorder 1`] = ` +"export function* traversePreorder(root) { + const stack = [root]; + while (stack.length > 0) { + const node = stack.pop(); + if (node) { + yield node; + stack.push(node.right, node.left); + } + } +}" +`; + exports[`App can render goody: Kotlin gcd(Int,Int) 1`] = ` "package gcd_int_int @@ -1226,3 +1271,54 @@ exports[`App can render goody: TypeScript compareNatural 1`] = ` throw new Error("Comparing mismatched types!"); }" `; + +exports[`App can render goody: TypeScript traverseInorder 1`] = ` +"export function* traverseInorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack: [T | null | undefined, boolean][] = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseChildren] = stack.pop()!; + if (node) { + if (didTraverseChildren) { + yield node; + } else { + stack.push([node.right, false], [node, true], [node.left, false]); + } + } + } +}" +`; + +exports[`App can render goody: TypeScript traversePostorder 1`] = ` +"export function* traversePostorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack: [T | null | undefined, boolean][] = [[root, false]]; + while (stack.length > 0) { + const [node, didTraverseChildren] = stack.pop()!; + if (node) { + if (didTraverseChildren) { + yield node; + } else { + stack.push([node, true], [node.right, false], [node.left, false]); + } + } + } +}" +`; + +exports[`App can render goody: TypeScript traversePreorder 1`] = ` +"export function* traversePreorder< + T extends { left?: T | null | undefined; right?: T | null | undefined }, +>(root: T | null | undefined): Generator { + const stack = [root]; + while (stack.length > 0) { + const node = stack.pop(); + if (node) { + yield node; + stack.push(node.right, node.left); + } + } +}" +`; From 591f04f425fbce2506a86bc518881075b968cd6f Mon Sep 17 00:00:00 2001 From: Miorel-Lucian Palii Date: Thu, 11 Jul 2024 14:27:51 -0700 Subject: [PATCH 2/2] Rename a variable --- .../goodies/typescript/traverseInorder/index.ts | 4 ++-- .../src/app/__tests__/__snapshots__/equip-test.ts.snap | 8 ++++---- .../src/app/__tests__/__snapshots__/render-test.ts.snap | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tools/adventure-pack/goodies/typescript/traverseInorder/index.ts b/tools/adventure-pack/goodies/typescript/traverseInorder/index.ts index 84f3f536..994fff9f 100644 --- a/tools/adventure-pack/goodies/typescript/traverseInorder/index.ts +++ b/tools/adventure-pack/goodies/typescript/traverseInorder/index.ts @@ -3,9 +3,9 @@ export function* traverseInorder< >(root: T | null | undefined): Generator { const stack: [T | null | undefined, boolean][] = [[root, false]]; while (stack.length > 0) { - const [node, didTraverseChildren] = stack.pop()!; + const [node, didTraverseLeftChild] = stack.pop()!; if (node) { - if (didTraverseChildren) { + if (didTraverseLeftChild) { yield node; } else { stack.push([node.right, false], [node, true], [node.left, false]); diff --git a/tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap b/tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap index fe32bdd0..139e4f7c 100644 --- a/tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap +++ b/tools/adventure-pack/src/app/__tests__/__snapshots__/equip-test.ts.snap @@ -835,9 +835,9 @@ exports[`App can equip single goody: JavaScript traverseInorder 1`] = ` function* traverseInorder(root) { const stack = [[root, false]]; while (stack.length > 0) { - const [node, didTraverseChildren] = stack.pop(); + const [node, didTraverseLeftChild] = stack.pop(); if (node) { - if (didTraverseChildren) { + if (didTraverseLeftChild) { yield node; } else { stack.push([node.right, false], [node, true], [node.left, false]); @@ -2030,9 +2030,9 @@ function* traverseInorder< >(root: T | null | undefined): Generator { const stack: [T | null | undefined, boolean][] = [[root, false]]; while (stack.length > 0) { - const [node, didTraverseChildren] = stack.pop()!; + const [node, didTraverseLeftChild] = stack.pop()!; if (node) { - if (didTraverseChildren) { + if (didTraverseLeftChild) { yield node; } else { stack.push([node.right, false], [node, true], [node.left, false]); diff --git a/tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap b/tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap index a186087e..3e36e7a9 100644 --- a/tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap +++ b/tools/adventure-pack/src/app/__tests__/__snapshots__/render-test.ts.snap @@ -511,9 +511,9 @@ exports[`App can render goody: JavaScript traverseInorder 1`] = ` "export function* traverseInorder(root) { const stack = [[root, false]]; while (stack.length > 0) { - const [node, didTraverseChildren] = stack.pop(); + const [node, didTraverseLeftChild] = stack.pop(); if (node) { - if (didTraverseChildren) { + if (didTraverseLeftChild) { yield node; } else { stack.push([node.right, false], [node, true], [node.left, false]); @@ -1278,9 +1278,9 @@ exports[`App can render goody: TypeScript traverseInorder 1`] = ` >(root: T | null | undefined): Generator { const stack: [T | null | undefined, boolean][] = [[root, false]]; while (stack.length > 0) { - const [node, didTraverseChildren] = stack.pop()!; + const [node, didTraverseLeftChild] = stack.pop()!; if (node) { - if (didTraverseChildren) { + if (didTraverseLeftChild) { yield node; } else { stack.push([node.right, false], [node, true], [node.left, false]);