Javascript 二叉树的最小深度并非适用于所有测试用例
我试图找到二叉树的最小深度;然而,我在示例5中的测试用例失败了。我不确定我的逻辑中是否存在缺陷,以使其适用于所有测试用例。我正在做的一个例子如下:Javascript 二叉树的最小深度并非适用于所有测试用例,javascript,algorithm,binary-tree,tree-traversal,Javascript,Algorithm,Binary Tree,Tree Traversal,我试图找到二叉树的最小深度;然而,我在示例5中的测试用例失败了。我不确定我的逻辑中是否存在缺陷,以使其适用于所有测试用例。我正在做的一个例子如下: Example: Given binary tree [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 return its minimum: depth = 2 我有以下代码来实现这一点: class TreeNode { constructor(val) {
Example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its minimum:
depth = 2
我有以下代码来实现这一点:
class TreeNode {
constructor(val) {
this.val = val;
this.left = this.right = null;
}
}
const minDepth = root => {
if (!root) return 0
const traverse = root => {
let counter = 1
if (!root) return counter
let current
let queue = [root, 's']
while (queue.length > 1) {
current = queue.shift()
if (current === 's') counter++, queue.push('s')
if (!current.left && !current.right) return counter
else {
if (current.left) queue.push(current.left)
if (current.right) queue.push(current.right)
}
}
return counter
}
return root.left && root.right ? Math.min(traverse(root.left), traverse(root.right)) + 1 : traverse(root)
}
//example 1
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)
//example 2
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)
//example 3
const tree3 = new TreeNode(0)
//example 4
const tree4 = new TreeNode(1)
tree4.left = new TreeNode(2)
//example 5 not working
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))
关于我遗漏了什么,有什么想法吗?我有点不确定你的总体方法。您的函数似乎已设置为执行递归,但随后您将在嵌套函数中迭代工作。这两种方法对我来说都很有意义(递归似乎更容易),但我建议明确地使用其中一种方法 如果您确实选择了迭代,基本上您会运行一个并在到达第一个叶节点时停止。叶节点是没有子节点的节点,我们也需要检测递归的这种情况 递归只是为每个叶向上传递1。否则,当前节点为内部节点;为其添加1,并向上传递其子级的最小递归次数(通过合并无穷大的值忽略任何不存在的值)
const minDepth=root=>{
如果(!root){
返回0;
}
else如果(!root.left&&!root.right){
返回1;
}
返回1+Math.min(minDepth(root.left)| |无穷大,
minDepth(根.右)| |无穷大);
};
三烯类{
构造函数(val){
this.val=val;
this.left=null;
this.right=null;
}
}
/*
3.
/ \
9 20
/ \
15 7
应该是2
*/
const tree1=新的TreeNode(3);
tree1.left=新的TreeNode(9);
tree1.right=新的TreeNode(20);
tree1.right.left=新的TreeNode(15);
tree1.right.right=新的TreeNode(7);
/*
1.
/ \
2 3
/ \
4 5
应该是3
*/
const tree2=新的TreeNode(1);
tree2.left=新的TreeNode(2);
tree2.right=新的TreeNode(3);
tree2.left.left=新的TreeNode(4);
tree2.right.right=新的TreeNode(5);
/*
0
应该是1
*/
常数tree3=新TreeNode(0);
/*
1.
/
2.
应该是2
*/
const tree4=新的TreeNode(1);
tree4.left=新的TreeNode(2);
/*
1.
/
2.
\
3.
\
4.
\
5.
应该是5岁
*/
常数tree5=新TreeNode(1);
tree5.left=新的TreeNode(2);
tree5.left.right=新的TreeNode(3);
tree5.left.right.right=新树节点(4);
树5.left.right.right.right=新树节点(5);
console.log(minDepth(tree1));
console.log(minDepth(tree2));
console.log(minDepth(tree3));
console.log(minDepth(tree4));
控制台日志(minDepth(tree5))代码>为什么要使用复杂的遍历
函数来处理循环、队列和哨兵值?一个简单的递归函数就足够了。