javascript - Resa i PreOrder på ett BinTree i typescript
Hej, jag fick i uppgift att implementera en funktion som itererar över ett binärt träd och returnerar alla dess värden i pre-order. Koden är som följer:
interface BinTree {
root: number;
left?: BinTree;
right?: BinTree;
};
const TreePreArray =(t:BinTree):number[] => {
let list = new Array<number>();
if (t==undefined) {return list }
else {
list.push(t.root)
list.concat(TreePreArray(t.left))
list.concat(TreePreArray(t.right))
}
return list
}
let bn : BinTree = {
root: 1,
left: { root: 2 },
right: { root: 3 }
}
console.log((TreePreArray(bn)));
men utdata är bara [1] och inte [1,2,3] Jag har kopierat idén från den här länken Recursive Tree Traversal Method With Return Type Array och implementerat den i typescript.
Svar #1
Du behöver trycka på eller använda resultatet av concat. På grund av den saknade tilldelningen av resultatet av concat missar du resultatet av att gå igenom grenarna.
Antingen
list = list.concat(TreePreArray(t.left))
list = list.concat(TreePreArray(t.right))
eller
list.push(...TreePreArray(t.left))
list.push(...TreePreArray(t.right))
Svar #2
Detta är faktiskt ett riktigt bra användningsfall för iteratorer:
function* leftFirst({left, right, root} : BinTree) {
yield root;
if(left) yield* leftFirst(left);
if(right) yield* leftFirst(right);
}
För att sedan få en array gör bara:
[...leftFirst(someTree)]
