如何在 TypeScript 中输出 Hackerrank 二叉树问题?
How to stdout Hackerrank Binary Tree question in TypeScript?
这是 Hackerrank 问题:
给定一个指向二叉树根的指针,你需要打印这棵树的层序遍历。在层序遍历中,从左到右逐层访问节点。完成函数并在单行中打印由 space.
分隔的值
我已经定义了函数 levelOrder()。但是不知道如何标准输出。还有为什么这里没有给出Node class。当我为这个问题检查 Java 等其他语言时,我看到声明了 Node class 。他们怎么能期望我把字符串当作节点来充当呢?我很困惑。
这是 hackerrank 编辑器中的完整代码,包括它们的设置:
'use strict';
process.stdin.resume();
process.stdin.setEncoding('utf-8');
let inputString: string = '';
let inputLines: string[] = [];
let currentLine: number = 0;
process.stdin.on('data', function(inputStdin: string): void {
inputString += inputStdin;
});
process.stdin.on('end', function(): void {
inputLines = inputString.split('\n');
inputString = '';
main();
});
function readLine(): string {
return inputLines[currentLine++];
}
function main() {
// Enter your code here
function levelOrder(root: any): string {
const queue = [root];
let visited = "";
let currentNode = root;
while (queue.length > 0) {
currentNode = queue.shift();
visited += `${currentNode.val} `;
if (currentNode.left) queue.push(currentNode.left);
if (currentNode.right) queue.push(currentNode.right);
}
return visited;
}
// How I am going to invoke my function and stdout return val here?
}
你是对的,这令人困惑。
显然,HackerRank 并没有真正在代码挑战的 TypeScript 版本上付出太多努力,因为模板代码中没有规定将文本输入转换为 TreeNode
数据结构,就像完成的那样对于其他语言。
其次,挑战也没有解释基于文本的输入是如何组织的。为此,我查看了 HackerRank 上的其他一些二叉树挑战,发现对于 this one,输入格式 是 描述的:
The first line contains an integer , the number of nodes in the tree.
Next line contains space separated integer where th integer denotes node[i].data.
Note: Node values are inserted into a binary search tree before a reference to the tree's root node is passed to your function. In a binary search tree, all nodes on the left branch of a node are less than the node value. All values on the right branch are greater than the node value.
所以,二叉树其实就是一棵二叉搜索树!并且应按顺序将输入值插入其中,以最终构建作为挑战主题的树。
出于某种神秘的原因,在使用 TypeScript 而不是其他语言解决挑战时,您必须自己执行此操作。
关于输出的问题,可以直接使用console.log
.
以下是一些通用代码,可用于使用 TypeScript 解决 HackerRank 上的二叉树问题:
class TreeNode {
left: TreeNode;
right: TreeNode;
data: number;
constructor(value: number) {
this.data = value;
this.left = null;
this.right = null;
}
}
function insertNode(node: TreeNode, data: number): TreeNode {
if (node === null) return new TreeNode(data);
if (data < node.data) {
node.left = insertNode(node.left, data);
} else {
node.right = insertNode(node.right, data);
}
return node;
}
function inputTree(): TreeNode {
const nodeValues = inputLines[1].match(/\d+/g).map(Number);
let root: TreeNode = null;
for (const nodeValue of nodeValues) {
root = insertNode(root, nodeValue);
}
return root;
}
有了这个,你的 main
代码可以有这样的结构:
function main() {
const root = inputTree();
const result = /* your solution code here, producing an array */;
console.log(result.join(" "));
}
为了完成我的回答,我在这里提供了一个剧透,说明我将如何为这个特定的代码挑战编写解决方案的核心,但我想上面的内容你真的已经足够了:
function* levelOrder(root: TreeNode) {
const queue: TreeNode[] = [root];
for (let i = 0; i < queue.length; i++) {
const node = queue[i];
yield node.data;
if (node.left) queue.push(node.left);
if (node.right) queue.push(node.right);
}
}
function main() {
const root = inputTree();
const result = [...levelOrder(root)];
console.log(result.join(" "));
}
这是 Hackerrank 问题:
给定一个指向二叉树根的指针,你需要打印这棵树的层序遍历。在层序遍历中,从左到右逐层访问节点。完成函数并在单行中打印由 space.
分隔的值我已经定义了函数 levelOrder()。但是不知道如何标准输出。还有为什么这里没有给出Node class。当我为这个问题检查 Java 等其他语言时,我看到声明了 Node class 。他们怎么能期望我把字符串当作节点来充当呢?我很困惑。
这是 hackerrank 编辑器中的完整代码,包括它们的设置:
'use strict';
process.stdin.resume();
process.stdin.setEncoding('utf-8');
let inputString: string = '';
let inputLines: string[] = [];
let currentLine: number = 0;
process.stdin.on('data', function(inputStdin: string): void {
inputString += inputStdin;
});
process.stdin.on('end', function(): void {
inputLines = inputString.split('\n');
inputString = '';
main();
});
function readLine(): string {
return inputLines[currentLine++];
}
function main() {
// Enter your code here
function levelOrder(root: any): string {
const queue = [root];
let visited = "";
let currentNode = root;
while (queue.length > 0) {
currentNode = queue.shift();
visited += `${currentNode.val} `;
if (currentNode.left) queue.push(currentNode.left);
if (currentNode.right) queue.push(currentNode.right);
}
return visited;
}
// How I am going to invoke my function and stdout return val here?
}
你是对的,这令人困惑。
显然,HackerRank 并没有真正在代码挑战的 TypeScript 版本上付出太多努力,因为模板代码中没有规定将文本输入转换为 TreeNode
数据结构,就像完成的那样对于其他语言。
其次,挑战也没有解释基于文本的输入是如何组织的。为此,我查看了 HackerRank 上的其他一些二叉树挑战,发现对于 this one,输入格式 是 描述的:
The first line contains an integer , the number of nodes in the tree. Next line contains space separated integer where th integer denotes node[i].data.
Note: Node values are inserted into a binary search tree before a reference to the tree's root node is passed to your function. In a binary search tree, all nodes on the left branch of a node are less than the node value. All values on the right branch are greater than the node value.
所以,二叉树其实就是一棵二叉搜索树!并且应按顺序将输入值插入其中,以最终构建作为挑战主题的树。
出于某种神秘的原因,在使用 TypeScript 而不是其他语言解决挑战时,您必须自己执行此操作。
关于输出的问题,可以直接使用console.log
.
以下是一些通用代码,可用于使用 TypeScript 解决 HackerRank 上的二叉树问题:
class TreeNode {
left: TreeNode;
right: TreeNode;
data: number;
constructor(value: number) {
this.data = value;
this.left = null;
this.right = null;
}
}
function insertNode(node: TreeNode, data: number): TreeNode {
if (node === null) return new TreeNode(data);
if (data < node.data) {
node.left = insertNode(node.left, data);
} else {
node.right = insertNode(node.right, data);
}
return node;
}
function inputTree(): TreeNode {
const nodeValues = inputLines[1].match(/\d+/g).map(Number);
let root: TreeNode = null;
for (const nodeValue of nodeValues) {
root = insertNode(root, nodeValue);
}
return root;
}
有了这个,你的 main
代码可以有这样的结构:
function main() {
const root = inputTree();
const result = /* your solution code here, producing an array */;
console.log(result.join(" "));
}
为了完成我的回答,我在这里提供了一个剧透,说明我将如何为这个特定的代码挑战编写解决方案的核心,但我想上面的内容你真的已经足够了:
function* levelOrder(root: TreeNode) { const queue: TreeNode[] = [root]; for (let i = 0; i < queue.length; i++) { const node = queue[i]; yield node.data; if (node.left) queue.push(node.left); if (node.right) queue.push(node.right); } } function main() { const root = inputTree(); const result = [...levelOrder(root)]; console.log(result.join(" ")); }