以下是Hackerrank的问题:


给定一个指向二叉树根的指针,需要打印该树的级别顺序遍历.在级别顺序遍历中,从左到右逐级访问 node .完成该函数,并在一行中用空格分隔打印值.


我已经定义了函数levelOrder().然而,我不知道该怎么做.还有为什么这里没有给出 node 类.当我判断Java等其他语言的这个问题时,我看到 node 类被声明了.他们怎么能指望我把字符串当作 node 来处理呢.我很困惑.

以下是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数据 struct 的规定,就像其他语言一样.

其次,挑战也没有解释基于文本的输入是如何组织的.为此,我研究了HackerRank上的其他一些二叉树挑战,发现对于this one,输入格式is描述:

第一行包含一个整数????, 树中的 node 数.

在将对树的根 node 的引用传递给函数之前,将Note:个 node 值插入到二叉搜索树中.在二叉搜索树中, node 左分支上的所有 node 都小于 node 值.右分支上的所有值都大于 node 值.

所以,二叉树实际上是一个二叉树!输入值应该插入其中,以便最终构建挑战主题树.

出于某种神秘的原因,在用TypeScript而不是其他语言解决挑战时,你必须自己这样做.

关于output,你可以用console.log.

下面是一些通用代码,你可以用它来解决关于HackerRank的TypeScript的二叉树问题:

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代码可以具有以下 struct :

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(" ")); }

Node.js相关问答推荐

Jest由于UUID而无法解析测试,即使在Jest中启用ESModule支持后也是如此

Mongoose:如何在文档中推送到Caped(有限大小,滚动窗口)数组?

MongoDB-$Lookup未获得适当的结果

FireStore事务似乎已允许并发编辑?

try 插入重复的邮箱时,mongoDB DuplicateKey 错误未定义

PEAN auth 应用程序:为什么 Angular 拦截器总是使用BehaviorSubject 返回 null(即初始值),而不是更新后的值?

express app.post的多个参数在Node.js中的定义是什么

node-gyp: "..\src\binding.cc: 没有这样的文件或目录"

Winston http 日志(log)级别的行为与 info 不同

如何在拦截器中发送不同的请求?

等价于 Node.js 的 Rails 控制台

我应该在(Docker)容器中使用 forever/pm2 吗?

如何在不全局安装的情况下在 Node REPL 中要求 node 模块?

node.js(ES6 / Babel)中 import X 和 import * as X 的区别?

Express.js中的bodyParser.urlencoded({extended: true }))和bodyParser.json()是什么意思?

NPM:为什么要安装这个包?

node.js 示例

在 Node.js 中获取终端的宽度

Mongoose:模式与模型?

NodeJS:如何调试检测到 EventEmitter 内存泄漏.添加了 11 个侦听器