'use strict'

/**
 * Definition for binary tree with next pointer.
 * function TreeLinkNode(val) {
 *     this.val = val;
 *     this.left = this.right = this.next = null;
 * }
 */

function TreeLinkNode(val) {
    this.val = val
    this.left = this.right = this.next = null
}


/**
 * @param {TreeLinkNode} root
 * @return {void} Do not return anything, modify tree in-place instead.
 */
// var connect = function (root) {
//     if (root === null) {
//         return
//     }
//     let curr = root
//     let prev = null
//     let queue = []
//     queue.push({
//         node: curr,
//         level: 1
//     })
//     while (queue.length !== 0) {
//         let q = queue[0]
//         queue = queue.slice(1)
//         if (prev !== null && prev.level === q.level) {
//             prev.node.next = q.node
//         }
//         prev = q
//         if (q.node.left !== null) {
//             queue.push({
//                 node: q.node.left,
//                 level: q.level + 1
//             })
//         }
//         if (q.node.right !== null) {
//             queue.push({
//                 node: q.node.right,
//                 level: q.level + 1
//             })
//         }
//     }
// }

// It is a FULL BST, so we can use some tricky method
var connect = function(root) {
    if (root === null) return
    connectHelper(root.left, root.right)
    connectHelper(root.right, null)
}

function connectHelper(node, next) {
    if (node === null) return
    node.next = next
    // NOTE: All values are truthy unless they are defined as falsy
    // If next === null, && return false, false || null => null;
    // else && return next.left, next.left || null => next.left
    let nextRight = next && next.left || null
    connectHelper(node.left, node.right)
    connectHelper(node.right, nextRight)
}

function __main__() {
    /*eslint no-console: ["error", { allow: ["log"] }] */
    let logger = console.log.bind(console)
    //       1
    //      / \
    //     2   3
    //    /\   /\
    //   4  5 6  7
    let n7 = new TreeLinkNode(7)
    let n6 = new TreeLinkNode(6)
    let n5 = new TreeLinkNode(5)
    let n4 = new TreeLinkNode(4)
    let n3 = new TreeLinkNode(3)
    n3.left = n6
    n3.right = n7
    let n2 = new TreeLinkNode(2)
    n2.left = n4
    n2.right = n5
    let n1 = new TreeLinkNode(1)
    n1.left = n2
    n1.right = n3
    connect(n1)
    logger(n1.next)
    logger(n2.next)
    logger(n4.next)
    logger(n5.next)
}

__main__()