如何使用Javascript在二叉搜索树中查找最长路径?
我试图找出如何在二叉搜索树中找到最长路径(没有真正体验过bst和递归),并找到了一个我根本不理解的解决方案如何使用Javascript在二叉搜索树中查找最长路径?,javascript,binary-search-tree,Javascript,Binary Search Tree,我试图找出如何在二叉搜索树中找到最长路径(没有真正体验过bst和递归),并找到了一个我根本不理解的解决方案 const height = (node) => { if(!node) return 0; var leftHeight = height(node.left); var rightHeight = height(node.right); return Math.max(leftHeight, rightHeight) + 1; } height(node) 柜台
const height = (node) => {
if(!node) return 0;
var leftHeight = height(node.left);
var rightHeight = height(node.right);
return Math.max(leftHeight, rightHeight) + 1;
}
height(node)
一个解释真是太棒了!谢谢 基本上,在某个时候,您的调用堆栈将是最长的路径 因此,让我们以这棵树为例:
A
/ \
B C
/ \
D E
以下为JS:
{
name: 'A'
left: {
name: 'B',
left: null,
right: null,
}
right: {
name: 'C',
left: {
name: 'D',
left: null,
right: null,
},
right: {
name: 'E',
left: null,
right: null,
}
}
}
然后执行节点(nodeA)
。从现在起,我将使用nodeX
引用节点X
的对象
然后<代码>高度(节点左)代码>将被执行,因为node.left
是nodeB
这基本上是height(nodeB)
。因此,您的调用堆栈如下所示:
height(nodeA)
height(nodeB)
height(nodeA)
height(nodeB)
height(null)
现在height(node.left)代码>被执行(节点现在是nodeB
)。因为nodeB的left
是null
这本质上是height(nodeB)
。然后,您的调用堆栈如下所示:
height(nodeA)
height(nodeB)
height(nodeA)
height(nodeB)
height(null)
现在,如果(!node)返回0,则行
将立即从函数返回,因为节点
为空
,因此!节点
为真
。返回值将为指定的0
调用堆栈现在又是这样(最后一个堆栈元素已被删除):
值leftHeight
现在将为0(因为这是刚刚返回的值)。
行var rightHeight=height(node.right)
基本上也会这样做,因为node.right
也是空的。所以Math.max(leftHeight,rightHeight)
本质上就是Math.max(0,0)
和so0。这加上1
就是一个。这将被退回。调用堆栈现在如下所示:
height(nodeA)
并且leftHeight
具有正确的值1
同样的情况现在也发生在右侧,对于C
。然而,此处的节点。left
将不会为null,而是节点
,因此将生成另一个堆栈帧:
height(nodeA)
height(nodeC)
height(nodeD)
此处,nodeD
的左侧和右侧均为null,并将返回1,与nodeB
相同。同样的情况也发生在nodeE
上。然后,nodeC
将leftHeight
设为1
,而rightHeight
设为1。加1等于2,因此height(nodeC)
将返回2
然后height(nodeA)
将leftHeight
设置为1
,rightweath
设置为2
。所以Math.max(leftHeight,rightHeight)+1代码>为3,结果正确
基本上,您的代码正在计数,+1
就是计数。计数的起点始终是返回0
您能给我们一个“节点”吗,这样我们就可以计算出您处理的数据了?