function traverseBreadth(root) {
if (root == null) {
return;
}
var currentNode = root;
var queue = [];
queue.push(currentNode)
while(queue.length > 0) {
if (queue[0].left != null) {
queue.push(queue[0].left)
}
if (queue[0].right != null) {
queue.push(queue[0].right)
}
console.log(queue[0])
queue.shift()
}
}
我正在尝试一种方法,以便可以在同一行中用空格隔开的所有相同级别的值记录下来。这种当前方式只是按照从左到右的级别顺序记录它们。
我尝试过有条件地检查左子节点和右子节点是否存在,以及是否将它们记录在一起,但是这将使当只有一个左或右节点时发生的事情无法进行。
答案 0 :(得分:1)
以下是两个功能。首先计算树的高度(提供了测试数据树),然后调用我认为您正在寻找的函数。 函数printLevel返回一个字符串,该字符串的每个值都位于根目录下的请求级别,以空格分隔。
// test data
class Node {
constructor($data = "", $left = null, $right = null) {
this.data = $data.toString();
this.left = $left;
this.right = $right;
}
}
let tree = new Node(
"- **a 1** -",
new Node(
"- **b 1** -",
new Node("- **c 1** -"),
new Node("- **c 2** -")
),
new Node(
"- **b 2** -",
new Node("- **c 3** -"),
new Node("- **c 4** -")
)
);
// functions
// Breadth First Traverse
// Return a string representing the given tree
function breadthTraverse(tree) {
let buffer = "";
if (tree == null) {
return buffer;
}
let temp = tree;
let height = 0;
while (temp != null) {
temp = temp.left;
++height;
}
for (let i = 1; i <= height; ++i) {
buffer += printLevel(tree, i) + "<br />";
}
return buffer;
}
function printLevel(root, level) {
let buffer = "";
if (root == null) {
return buffer;
}
if (level == 1) {
buffer += root.data;
} else if (level > 1) {
buffer += printLevel(root.left, level - 1);
buffer += " ";
buffer += printLevel(root.right, level - 1);
}
return buffer;
}
// test functions
let output = `
<div>
<h4>Breadth First Traverse:</h4>
<br />
${breadthTraverse(tree)}
<br />
</div>
`;
// display logistics
let con = document.getElementById("session");
con.innerHTML = output;
<div id="session">
</div>