Skip to content

Instantly share code, notes, and snippets.

@eczn
Last active August 6, 2023 10:24
Show Gist options
  • Save eczn/a55fdf531f8ffe288f85ca13db18f5c1 to your computer and use it in GitHub Desktop.
Save eczn/a55fdf531f8ffe288f85ca13db18f5c1 to your computer and use it in GitHub Desktop.
functional data structure ?
// 从三个参数中选择一个
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