typescript - 如何在打字稿中等待递归函数完成
问题描述
我编写了一个程序来将二叉树反序列化为字符串。
let serializedTreeString: string = '';
class BinaryTreeNode {
_val: number;
_left: BinaryTreeNode;
_right: BinaryTreeNode;
constructor(val: number, left: BinaryTreeNode = null, right: BinaryTreeNode = null) {
this._val = val;
this._left = left;
this._right = right;
}
}
function _serialize(current: BinaryTreeNode) {
if (current === null) {
serializedTreeString = serializedTreeString.concat('-1,');
} else {
serializedTreeString = serializedTreeString.concat(current._val + ',');
_serialize(current._left);
_serialize(current._right);
}
}
function serialize(current: BinaryTreeNode) {
let serializedTreeString: string = '';
_serialize(current);
console.log(serializedTreeString);
}
let root: BinaryTreeNode = new BinaryTreeNode(20, new BinaryTreeNode(8, new BinaryTreeNode(4), new BinaryTreeNode(12, new BinaryTreeNode(10), new BinaryTreeNode(14))), new BinaryTreeNode(22));
serialize(root);
当我打印 serializedTreeString 时,它的空白作为 java 脚本是异步的。我可以使用一个计数器,它会在每次调用_serialize 时增加并在_serialize 内减少。这样我可以检查计数器是否达到 0 并打印 serializedTreeString 的值。有一个更好的方法吗?
解决方案
你得到一个空字符串不是因为 javascript 是异步的(你的例子中的所有调用都是同步的)。这是因为您在内部隐藏外部变量定义serialize
。只需let
在前面删除serializedTreeString
:
function serialize(current: BinaryTreeNode) {
serializedTreeString = '';
_serialize(current);
console.log(serializedTreeString);
}
一般来说,尽管在这种情况下最好避免使用全局变量并使用 return 代替:
class BinaryTreeNode {
_val: number;
_left: BinaryTreeNode;
_right: BinaryTreeNode;
constructor(val: number, left: BinaryTreeNode = null, right: BinaryTreeNode = null) {
this._val = val;
this._left = left;
this._right = right;
}
}
function serialize(current: BinaryTreeNode): string {
if (current === null) {
return "-1,";
} else {
return `${current._val},${serialize(current._left)}${serialize(current._right)}`;
}
}
let root: BinaryTreeNode = new BinaryTreeNode(20, new BinaryTreeNode(8, new BinaryTreeNode(4), new BinaryTreeNode(12, new BinaryTreeNode(10), new BinaryTreeNode(14))), new BinaryTreeNode(22));
console.log(serialize(root));
推荐阅读
- prism - 订阅事件但想要获取初始值
- xcode - Xcode 中的文件路径损坏。(很多 ../../../../)
- formatting - 在 Power BI 中格式化“卡片”以显示数百万到 2 dp 或数千到 1 dp
- swift - 视频本地文件 URL 与保存的相册不兼容
- r - mlr:避免交叉验证中的数据泄漏
- java - 这种单例线程的实现是否安全、无序列化问题且性能良好?
- android - 在谷歌云平台上安卓设备(安卓派)和服务器之间的MQTT通信需要一些帮助
- sql-server - “由于“活动事务”,数据库的事务日志已满 - 无法备份、放大、截断或缩小
- r - 如何从文本文件中读取某些行,同时忽略使用 R 之间的几行(也将这些行分隔为列)?
- java - 生产者更快,消费者延迟,Java