這是 Hackerrank 問題:
給定一個指向二叉樹根的指標,您需要列印這棵樹的級別順序遍歷。在層序遍歷中,節點從左到右逐層訪問。完成函式并將值列印在由空格分隔的單行中。
我已經定義了函式 levelOrder()。但是不知道如何標準輸出。還有為什么這里沒有給出 Node 類。當我為這個問題檢查其他語言(如 Java)時,我看到宣告了 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?
}
uj5u.com熱心網友回復:
你說得對,這令人困惑。
TreeNode顯然,HackerRank 并沒有真正在 TypeScript 版本的代碼挑戰中投入太多精力,因為模板代碼中沒有像其他語言那樣將文本輸入轉換為資料結構的規定。
其次,挑戰也沒有解釋基于文本的輸入是如何組織的。為此,我查看了 HackerRank 上的其他一些二叉樹挑戰,發現對于這個挑戰,輸入格式被描述為:
第一行包含一個整數 ??,即樹中的節點數。下一行包含 ?? 空格分隔的整數,其中 ??th 整數表示 node[i].data。
注意:在將樹的根節點的參考傳遞給您的函式之前,節點值被插入到二叉搜索樹中。在二叉搜索樹中,一個節點左分支上的所有節點都小于該節點值。右分支上的所有值都大于節點值。
所以,二叉樹實際上是二叉搜索樹!并且輸入值應該按順序插入其中,以最終構建作為挑戰主題的樹。
出于某種神秘的原因,在使用 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(" ")); }
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/466987.html
