Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Javascript在二叉搜索树中查找最长路径?_Javascript_Binary Search Tree - Fatal编程技术网

如何使用Javascript在二叉搜索树中查找最长路径?

如何使用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) 柜台

我试图找出如何在二叉搜索树中找到最长路径(没有真正体验过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)
  • 柜台在哪里?在我看来,leftHeight和rightHeight将存储最后一个值。如果不计算每个值,它怎么可能计算呢
  • 我在哪里实际返回值?我返回最终结果-->Math.max(leftHeight,rightHeight),但在每次递归调用中,我在哪里添加、保存和返回值

  • 一个解释真是太棒了!谢谢

    基本上,在某个时候,您的调用堆栈将是最长的路径

    因此,让我们以这棵树为例:

      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

    您能给我们一个“节点”吗,这样我们就可以计算出您处理的数据了?