javascript:首先遍历树的宽度并在同一行记录相同的级别值

时间:2018-08-12 07:25:26

标签: javascript

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

我正在尝试一种方法,以便可以在同一行中用空格隔开的所有相同级别的值记录下来。这种当前方式只是按照从左到右的级别顺序记录它们。
我尝试过有条件地检查左子节点和右子节点是否存在,以及是否将它们记录在一起,但是这将使当只有一个左或右节点时发生的事情无法进行。

1 个答案:

答案 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>