65、为通用二叉树实现前序遍历。前序遍历是先访问父节点,然后是左子树,最后是右子树。尝试使用生成器来实现它。
以下是使用 TypeScript 实现的通用二叉树前序遍历的生成器代码:
class BinaryTreeNode<T> {
constructor(public value: T, public left: BinaryTreeNode<T> | undefined = undefined, public right: BinaryTreeNode<T> | undefined = undefined) {}
}
function* preOrderTraversal<T>(node: BinaryTreeNode<T> | undefined): IterableIterator<T> {
if (node) {
yield node.value;
yield* preOrderTraversal(node.left);
yield* preOrderTraversal(node.right);
}
}
你可以使用以下方式调用这个生成器:
// 创建一个简单的二叉树
const root = new BinaryTreeNode(1);
root.left = new BinaryTreeNode(2);
root.right = new BinaryTreeNode(3);
root.left.left = new BinaryTreeNode(4);
root.left.right = new BinaryTreeNode(5);
// 使用生成器进行前序遍历
for (const value of preOrderTraversal(root)) {
console.log(value);
}
上述代码首先定义了 BinaryTreeNode 类来表示二叉树的节点。然后,定义了 preOrderTraversal 生成器函数,它接受一个 BinaryTreeNode 作为参数。在函数内部,如果节点存在,它会先 yield 节点的值,然后递归调用 preOrderTraversal 生成器函数来遍历左子树和右子树。最后,通过 for...of 循环来遍历生成器返回的结果。
66、实现一个从后往前遍历数组的函数。
可以使用以下函数实现从后往前遍历数组:
function* backwardsArrayIterator<T>(array: T[]): IterableIterator<T> {
for (let i = array.length - 1; i >= 0; i--) {
yield array[i];
}
}
67、创建一个管道,给定一个迭代器,返回第六、七、八、九和十个元素。提示:这可以通过组合使用 drop() 和 take() 函数来实现。
首先实现 `drop()` 函数,其功能是丢弃迭代器的前 `n` 个元素并返回剩余元素。然后使用 `drop()` 丢弃前 5 个元素,再用 `take()` 取接下来的 5 个元素。
以下是示例代码:
```ts
function* drop<T>(iter: Iterable<T>, n: number): IterableIterator<T> {
let count = 0;
for (const value of iter) {
if (count++ >= n) {
yield value;
}
}
}
const values = take(drop(iterator, 5), 5);
其中 iterator 是给定的迭代器。
需要注意的是,这里代码中使用了 take 函数,但未对其进行定义,以下是补充 take 函数定义后的完整代码:
function* drop<T>(iter: Iterable<T>, n: number): IterableIterator<T> {
let count = 0;
for (const value of iter) {
if (count++ >= n) {
yield value;
}
}
}
function* take<T>(iter: Iterable<T>, n: number): IterableIterator<T> {
let count = 0;
for (const value of iter) {
if (count++ < n) {
yield value;
} else {
break;
}
}
}
const iterator = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const values = take(drop(iterator, 5), 5);
for (const val of values) {

最低0.47元/天 解锁文章
5万+

被折叠的 条评论
为什么被折叠?



