Я немного не уверен в вашем общем подходе. Кажется, ваша функция настроена на выполнение рекурсии, но затем вы работаете итеративно внутри вложенной функции. Оба подхода имеют смысл для меня (рекурсия кажется более простой), но я бы рекомендовал четко фиксировать один или другой.
Если вы выберете итеративный, в основном вы запустите BFS и остановиться, когда вы нажмете первый листовой узел. Конечный узел - это узел без дочерних элементов, и нам необходимо обнаружить такой случай и для рекурсии.
Рекурсия просто передает 1 до родителя для каждого листа. В противном случае текущий узел является внутренним узлом; добавьте для него 1 и пропустите минимум рекурсии для его потомков (игнорируйте все, что не присутствует, объединив бесконечное значение для него).
const minDepth = root => {
if (!root) {
return 0;
}
else if (!root.left && !root.right) {
return 1;
}
return 1 + Math.min(minDepth(root.left) || Infinity,
minDepth(root.right) || Infinity);
};
class TreeNode {
constructor(val) {
this.val = val;
this.left = null;
this.right = null;
}
}
/*
3
/ \
9 20
/ \
15 7
should be 2
*/
const tree1 = new TreeNode(3);
tree1.left = new TreeNode(9);
tree1.right = new TreeNode(20);
tree1.right.left = new TreeNode(15);
tree1.right.right = new TreeNode(7);
/*
1
/ \
2 3
/ \
4 5
should be 3
*/
const tree2 = new TreeNode(1);
tree2.left = new TreeNode(2);
tree2.right = new TreeNode(3);
tree2.left.left = new TreeNode(4);
tree2.right.right = new TreeNode(5);
/*
0
should be 1
*/
const tree3 = new TreeNode(0);
/*
1
/
2
should be 2
*/
const tree4 = new TreeNode(1);
tree4.left = new TreeNode(2);
/*
1
/
2
\
3
\
4
\
5
should be 5
*/
const tree5 = new TreeNode(1);
tree5.left = new TreeNode(2);
tree5.left.right = new TreeNode(3);
tree5.left.right.right = new TreeNode(4);
tree5.left.right.right.right = new TreeNode(5);
console.log(minDepth(tree1));
console.log(minDepth(tree2));
console.log(minDepth(tree3));
console.log(minDepth(tree4));
console.log(minDepth(tree5));
Вот версия BFS:
const minDepth = root => {
for (const queue = [[root, 1]]; queue.length;) {
const [node, depth] = queue.shift();
if (node) {
if (!node.left && !node.right) {
return depth;
}
queue.push([node.left, depth + 1], [node.right, depth + 1]);
}
}
return 0;
};
class TreeNode {
constructor(val) {
this.val = val;
this.left = null;
this.right = null;
}
}
/*
3
/ \
9 20
/ \
15 7
should be 2
*/
const tree1 = new TreeNode(3);
tree1.left = new TreeNode(9);
tree1.right = new TreeNode(20);
tree1.right.left = new TreeNode(15);
tree1.right.right = new TreeNode(7);
/*
1
/ \
2 3
/ \
4 5
should be 3
*/
const tree2 = new TreeNode(1);
tree2.left = new TreeNode(2);
tree2.right = new TreeNode(3);
tree2.left.left = new TreeNode(4);
tree2.right.right = new TreeNode(5);
/*
0
should be 1
*/
const tree3 = new TreeNode(0);
/*
1
/
2
should be 2
*/
const tree4 = new TreeNode(1);
tree4.left = new TreeNode(2);
/*
1
/
2
\
3
\
4
\
5
should be 5
*/
const tree5 = new TreeNode(1);
tree5.left = new TreeNode(2);
tree5.left.right = new TreeNode(3);
tree5.left.right.right = new TreeNode(4);
tree5.left.right.right.right = new TreeNode(5);
console.log(minDepth(tree1));
console.log(minDepth(tree2));
console.log(minDepth(tree3));
console.log(minDepth(tree4));
console.log(minDepth(tree5));