Last active
August 6, 2023 10:24
-
-
Save eczn/a55fdf531f8ffe288f85ca13db18f5c1 to your computer and use it in GitHub Desktop.
functional data structure ?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 从三个参数中选择一个 | |
type Selector<T> = | |
(v: T, l?: Tree<T>, r?: Tree<T>) => undefined | T | Tree<T>; | |
// 定义树 | |
type Tree<T> = ( | |
<S extends Selector<T>>(selector: S) => ReturnType<S> | |
); | |
// 构造 Tree | |
function Tree<T>(v: T, l?: Tree<T>, r?: Tree<T>): Tree<T> { | |
return <S extends Selector<T>>(selector: S) => { | |
return selector(v, l, r) as ReturnType<S>; | |
} | |
} | |
// 取左子树 | |
function lchild<T>(tree: Tree<T>) { | |
return tree((v, l, r) => l); | |
} | |
// 取右子树 | |
function rchild<T>(tree: Tree<T>) { | |
return tree((v, l, r) => r); | |
} | |
// 取值 | |
function valOf<T>(tree: Tree<T>) { | |
return tree((v, l, r) => v); | |
} | |
// 函数式二叉树的前序遍历 | |
function traversal<T>(t?: Tree<T>) { | |
if (!t) return; | |
const l = lchild(t); | |
const r = rchild(t); | |
const v = valOf(t); | |
console.log(v); | |
traversal(l); | |
traversal(r); | |
} | |
// 创建一棵树。。。 | |
// 虽然有点绕... | |
const t = | |
Tree(1, | |
Tree(2, | |
Tree(3), Tree(4)), Tree(5, Tree(6))) | |
// 结构如下: | |
// 1 | |
// / \ | |
// 2 5 | |
// / \ / | |
// 3 4 6 | |
// 先序遍历结果 | |
traversal(t); | |
// => 打印:123456 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment