/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {TreeNode}
*/
const TreeNode = require('./utils.js')
var subtreeWithAllDeepest = function (root) {
let deepest = 0,
subtree,
parents = {},
deepestNodes = [0]
const queue = [root]
root.depth = 0
root.parent = null
while (queue.length) {
const curr = queue.shift(),
depth = curr.depth
left = curr.left
right = curr.right
if (!(right && left)) {
if (deepestNodes[0] < depth) {
deepestNodes = [depth]
}
deepestNodes.push(curr)
}
if (right) {
right.depth = depth + 1
queue.push(right)
right.parent = curr
if (deepest < right.depth) {
deepest = right.depth
}
}
if (left) {
left.depth = depth + 1
queue.push(left)
left.parent = curr
if (deepest < left.depth) {
deepest = left.depth
}
}
}
const recurse = () => {}
let parent,
test = deepestNodes.slice(1)
while (test.length) {
const curr = test.pop()
if (!curr.parent) {
continue
}
parent = curr.parent
if (!parents[curr.parent.val]) {
parents[curr.parent.val] = [parent]
}
if (test.length === 0) {
test
}
}
//Test cases
console.log(parents)
// return parent
// return subtree
}
const node = {
val: 3,
right: {
val: 1,
right: { val: 8, right: null, left: null },
left: { val: 0, right: null, left: null },
},
left: {
val: 5,
right: {
val: 2,
right: { val: 4, right: null, left: null },
left: { val: 7, right: null, left: null },
},
left: {
val: 6,
left: { val: 10, right: null, left: null },
right: { val: 9, right: null, left: null },
},
},
}
const node1 = {
val: 3,
right: {
val: 1,
right: { val: 8, right: null, left: null },
left: { val: 0, right: null, left: null },
},
left: {
val: 5,
right: {
val: 2,
right: { val: 4, right: null, left: null },
left: { val: 7, right: null, left: null },
},
left: { val: 6, right: null, left: null },
},
}
console.log(subtreeWithAllDeepest(node))
console.log('--------------------------')
console.log(subtreeWithAllDeepest(node1))