携程笔试题:根据二叉树的层序遍历结果输出其先序遍历的结果;(题设未说明是完全二叉树,但是感觉应该是完全二叉树,否则无法求解)
/**
* 根据层序遍历结果输出先序遍历结果
* @param {[Array]} tree [存放层序遍历结果]
* @return {[Array]} [返回先序遍历结果]
*/
function preOrder (tree) {
// 建立二叉树
var
res = [],
inner = [],
layer = 1,
len = tree.length,
l = 0;
if (len < 0) {
return;
}
for (var i=0; i<len; i++) {
l = tree.slice(i).length;
inner = [];
for (var j=0; j<(l > layer ? layer : l);j++) {
inner.push(tree[i++]);
}
res.push(inner);
i--;
layer *= 2;
}
// 前序遍历(递归)
var result = [];
traverse(res, 0, 0);
function traverse (arr, x, y ) {
var lens = arr.length;
if (!(x < lens && y < arr[x].length)) {
return;
}
if (arr[x][y]) {
result.push(arr[x][y]);
}
if (x+1 < lens && arr[x + 1][2 * y]) {
traverse(arr, x + 1, 2 * y);
}
if (x + 1 < lens && arr[x + 1][2 * y + 1]) {
traverse(arr, x + 1, 2 * y + 1);
}
}
console.log(result);
}
var tree = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K'];
preOrder(tree); //["A", "B", "D", "H", "I", "E", "J", "K", "C", "F", "G"]