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)]