二叉树

class ANode {
    constructor(public value: number, public left?: ANode, public right?: ANode) { }
}

let root = new ANode(1, new ANode(2, new ANode(4, new ANode(8))), new ANode(3, new ANode(6), new ANode(7, new ANode(9))))
printNodesLayerZOrder([root], [], true)

function printNodesDeepFirst(n: ANode) {
    console.log(n.value)
    if (n.left) printNodesDeepFirst(n.left)
    if (n.right) printNodesDeepFirst(n.right)
}

function printNodesLayerFirst(ns: ANode[]) {
    if (ns.length > 0) {
        console.log(ns[0].value)
        if (ns[0].left) ns.push(ns[0].left)
        if (ns[0].right) ns.push(ns[0].right)
        ns.splice(0, 1)
        printNodesLayerFirst(ns)
    }
}

function printNodesLayerReverse(ns: ANode[]) {
    if (ns.length > 0) {
        console.log(ns[0].value)
        if (ns[0].right) ns.push(ns[0].right)
        if (ns[0].left) ns.push(ns[0].left)
        ns.splice(0, 1)
        printNodesLayerReverse(ns)
    }
}

function printNodesLayerZOrder(ns: ANode[], ns2: ANode[], printLeftToRight: boolean) {
    if (printLeftToRight && ns.length > 0) {
        console.log(ns[0].value)
        if (ns[0].left) ns2.splice(0, 0, ns[0].left)
        if (ns[0].right) ns2.splice(0, 0, ns[0].right)
        ns.splice(0, 1)
        if (ns.length == 0) printLeftToRight = !printLeftToRight;
    } else if (!printLeftToRight && ns2.length > 0) {
        console.log(ns2[0].value)
        if (ns2[0].right) ns.splice(0, 0, ns2[0].right)
        if (ns2[0].left) ns.splice(0, 0, ns2[0].left)
        ns2.splice(0, 1)
        if (ns2.length == 0) printLeftToRight = !printLeftToRight;
    }
    if (ns.length != 0 || ns2.length != 0) {
        printNodesLayerZOrder(ns, ns2, printLeftToRight)
    }
}