我编写了用于查找二叉树直径的代码。但我无法弄清楚它出了什么问题。我写的两个函数及其定义如下: -
int btree::diameteroftree(node* leaf)
{
if (leaf==NULL)
return 0;
int lheight = hieghtoftree(leaf->left);
int rheight = hieghtoftree(leaf->right);
int ldiameter = diameteroftree(leaf->left);
int rdiameter = diameteroftree(leaf->right);
return max(lheight + rheight + 1,max(ldiameter,rdiameter));
}
int btree::hieghtoftree(node* leaf)
{
int left=0,right=0;
if(leaf==NULL)
return -1;
else
{
left=hieghtoftree(leaf->left);
right=hieghtoftree(leaf->right);
if(left > right)
return left +1;
else
return right+1;
}
}
我无法弄清楚我在哪里错了。有人能告诉我......
答案 0 :(得分:1)
您想要返回最长路径上的节点数。因此,算法中存在的问题是这一行:
return max(lheight + rheight + 1,max(ldiameter,rdiameter));
其中
rootDiameter = lheight + rheight + 1
是从左树的最深节点到右树的最深节点的路径长度。但是,此计算不正确。单个节点返回高度0,因此不会计算。您有两种选择:
hieghtoftree
以返回最深路径上的节点数而不是“跳数”
return max(lheight + rheight + 3,max(ldiameter,rdiameter));
答案 1 :(得分:0)
考虑具有根R的3节点树和2叶L1,L2。然后heightoftree(L1)== heightoftree(L2)== -1。因此,Diameteroftree(R)将是(-1)+( - 1)+ 1 = -1?!
我建议返回-1; - >返回0; 和 return max(lheight + rheight + 1,max(ldiameter,rdiameter)); - > return max(lheight + rheight + 2,max(ldiameter,rdiameter));
结果将是路径上的边数。如果计算节点数,则根据需要在最终结果中加一或减一。