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

标签 javascript c binary-tree

我在理解/重写给定 here 的“优化”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))
       }  
}

关于javascript - 重构 C 函数以在 O(n) 到 JavaScript 中查找二叉树的直径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34378945/

相关文章:

java - 有重复的 BST

javascript - 在 React 中解析 JSON 输入时出错

javascript - Mongoose 超时与 AWS DocumentDB 交谈

javascript - 在 Socket.IO 和 WS 之间共享 WebSocket 连接

javascript - Bootstrap 导航栏会展开但不会折叠

c - 函数 ‘mknod’ 的隐式声明,但我包含了 header

algorithm - 具有不等式、AND 和幂的二叉树

c - 为什么C语言的设计者要这样打等价?

c++ - C 和 C++ 之间的区别 ( lseek() )

java - 二叉树的递归代码流程