'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__()