[英]Refactoring C function to find diameter of Binary Tree in O(n) to JavaScript
我在理解/重寫此處給出的用於查找二叉樹直徑的“優化” 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))
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.