TypeScript生成器与迭代器应用实战

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) {
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值