以下是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相关问答推荐

Firebase-admin筛选器.或只考虑第一个WHERE子句

Node.js PNG缓冲区获取未知图像格式错误

try 使用Express和连接池将数据插入MySQL数据库时出现拒绝访问错误

使用 NPM 8 安装本地构建

动态设置元数据,无需重复请求 NextJS 13

在 getServerSideProps 中使用 EmailProvider 获取 NextAuth 会话会抛出 fs找不到模块

为什么它无法发送发布请求并更改为 chrome 中的获取方法?

只要我在后端正确验证所有内容,就可以将这些数据存储在本地存储中吗?

在路由上使用中间件时,Nodejs Express 应用程序失败

使用 NPM 三个 mocha+typescript 进行测试

nvm / node / npm: node 12 的 npm 比 node 14 的更新?

使用 firebase 函数 api 运行套接字(相同的端口创建问题)

来自 Node-aws 的 Dynamo Local:所有操作都失败无法对不存在的表执行操作

Puppeteer 错误:未下载 Chromium 修订版

如何undo撤消 Object.defineProperty 调用?

如何使用 Node.js、Express 和 Mongoose 进行身份验证?

Selenium WebDriver 等到元素显示

Node.js 连接仅适用于本地主机

Nodejs将字符串转换为UTF-8

Cordova 无法加载 platformapi