我编写了将二进制树反序列化为字符串的程序。
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));