重构C函数以查找O(n)到JavaScript中二叉树的直径

重构C函数以查找O(n)到JavaScript中二叉树的直径,javascript,c,binary-tree,Javascript,C,Binary Tree,我很难理解/重新编写用于查找二叉树直径的“优化”C函数。我不明白它是如何记录高度的。我知道它是使用第二个参数height来完成的,但是在代码中我甚至没有看到height参数被使用。我很难理解C中的函数,我主要用JavaScript编写。我能够重新编写页面上的所有其他函数,但没有问题 /*The second parameter is to store the height of tree. Initially, we need to pass a pointer to a location

我很难理解/重新编写用于查找二叉树直径的“优化”C函数。我不明白它是如何记录高度的。我知道它是使用第二个参数height来完成的,但是在代码中我甚至没有看到height参数被使用。我很难理解C中的函数,我主要用JavaScript编写。我能够重新编写页面上的所有其他函数,但没有问题

/*The second parameter is to store the height of tree.
   Initially, we need to pass a pointer to a location with value
   as 0. So, function should be used as follows:

   int height = 0;
   struct node *root = SomeFunctionToMakeTree();
   int diameter = diameterOpt(root, &height); */
int diameterOpt(struct node *root, int* height)
{
  /* lh --> Height of left subtree
      rh --> Height of right subtree */
  int lh = 0, rh = 0;

  /* ldiameter  --> diameter of left subtree
      rdiameter  --> Diameter of right subtree */
  int ldiameter = 0, rdiameter = 0;

  if(root == NULL)
  {
    *height = 0;
     return 0; /* diameter is also 0 */
  }

  /* Get the heights of left and right subtrees in lh and rh
    And store the returned values in ldiameter and ldiameter */
  ldiameter = diameterOpt(root->left, &lh);
  rdiameter = diameterOpt(root->right, &rh);

  /* Height of current node is max of heights of left and
     right subtrees plus 1*/
  *height = max(lh, rh) + 1;

  return max(lh + rh + 1, max(ldiameter, rdiameter));
}

通过引用传递的近似等价物(以及您提供的示例中的注释)将是具有属性的对象:

var heightHolder = { height:0};
var diam = diameterOpt(root, heightHolder);
console.log(heightHolder.height);

function diameterOpt(root, heightHolder){
   if (!root)  {
      heightHolder.height = 0; 
      return 0;
   }
   var refLh = {height:0};
   var refRh = {height:0};
   var ldiameter = diameterOpt(root.left, refLh); 
   ....
   heightHolder.height = Math.max(refLh.height, refRh.height) + 1;
   return ...
}

通常情况下,您不会走JavaScript支持以更自然的方式返回多个值的疯狂路线:

 function diameterOpt(root){
    if (!root){
       return {height:0, diameter:0};
    }
    var leftResult = diameterOpt(root.left);
    var rightResult = diameterOpt(root.right);

    return {
       height:  Math.max(leftResult.height,rightResult.height) + 1;
       diameter: 
           Math.max(leftResult.height+rightResult.height + 1,
                    Math.max(leftResult.diameter, rightResult.diameter))
       }  
}

通过引用传递的近似等价物(以及您提供的示例中的注释)将是具有属性的对象:

var heightHolder = { height:0};
var diam = diameterOpt(root, heightHolder);
console.log(heightHolder.height);

function diameterOpt(root, heightHolder){
   if (!root)  {
      heightHolder.height = 0; 
      return 0;
   }
   var refLh = {height:0};
   var refRh = {height:0};
   var ldiameter = diameterOpt(root.left, refLh); 
   ....
   heightHolder.height = Math.max(refLh.height, refRh.height) + 1;
   return ...
}

通常情况下,您不会走JavaScript支持以更自然的方式返回多个值的疯狂路线:

 function diameterOpt(root){
    if (!root){
       return {height:0, diameter:0};
    }
    var leftResult = diameterOpt(root.left);
    var rightResult = diameterOpt(root.right);

    return {
       height:  Math.max(leftResult.height,rightResult.height) + 1;
       diameter: 
           Math.max(leftResult.height+rightResult.height + 1,
                    Math.max(leftResult.diameter, rightResult.diameter))
       }  
}

在JavaScript中,最接近的“等价物”是:
函数diameterOpts(..,height/*一个对象*/)。。var lh={value:0}。。高度值=最大值(左侧值、右侧值)+1
。在这种情况下,height变量(从外部提供)用于通过对象的变异(直接在JavaScript中,或通过C中的指针间接定向)将高度返回给调用者。在JavaScript中,最接近的“等价物”是:
function diameterOpts(..,height/*an object*/)。。var lh={value:0}。。高度值=最大值(左侧值、右侧值)+1
。在这种情况下,height变量(由外部提供)用于通过对象的变异(直接在JavaScript中,或通过C中的指针间接)将高度返回给调用者。你能完成
部分吗。@DanielKobe添加了非编译/非测试的复制粘贴就绪代码。太棒了。所以,等等,使用高度参数没有办法做到这一点,只是好奇?@DanielKobe JavaScript没有。引用变量的概念,所以-不。另一方面,如果你脑子里有特定的语法,那么通过一些额外的努力就有可能实现。我在理解这段代码时遇到了很多困难。你能完成
部分吗。@DanielKobe添加了非编译/非测试的复制粘贴就绪代码。太棒了。所以,等等,使用高度参数没有办法做到这一点,只是好奇?@DanielKobe JavaScript没有。引用变量的概念,所以-不。另一方面,如果您考虑了特定的语法,则有合理的机会通过一些额外的努力来实现。