"树的直径(有时称为宽度)是树中任意两个节点之间最长路径上的节点数"。
下面的C ++函数是否适用于所有情况以查找二叉树的直径?称为root
,int helper(node *root,int &s){
int l = 0, r = 0;
if(root == NULL){
return 0;
}
l= helper(root->left,s); //height of left subtree.
r= helper(root->right,s); //height of right subtree.
int mx_single=max(l,r)+1;
int mx_top=max(mx_single,l+r+1);
s=max(s,mx_top);
return mx_single;
}
=二叉树的根
ans
返回主页后,s
将为if ($params['mobile_app']) {
if (isset($params['mobile_app_date'])) {
$query->join('field_data_field_on_mobile_app', 'm', 'm.entity_id = n.nid');
$query->join('field_data_field_mobile_app_date', 'm', 'm.entity_id = n.nid');
$query
->condition('m.field_on_mobile_app_value', 1)
->condition('m.field_mobile_app_date_value', dosomething_helpers_convert_date($params['mobile_app_date']), '<=')
->condition('m.field_mobile_app_date_value2', dosomething_helpers_convert_date($params['mobile_app_date']), '>=');
} else {
$query->join('field_data_field_on_mobile_app', 'm', 'm.entity_id = n.nid');
$query->condition('m.field_on_mobile_app_value', 1);
}
}
。
答案 0 :(得分:2)
在许多情况下,我看起来不对,但如果您的变量名称更具描述性,那将会很有帮助。该函数需要返回指定树的直径,但递归实现也需要使用每个子树的高度。
将你的直径定义包括在计数中的叶节点,它可以递归地重新表示:
如果树由单个节点组成,则其直径为1.(整个树是从一个叶节点到自身的单节点路径)。
如果子树的根节点只有一个子节点,则其直径是以该子节点为根的子树的直径。接下来是因为所有叶子节点都在子树中,因此从叶子到叶子的所有非循环路径都被限制在子树中。
否则,直径在左子树的直径,右子树的直径和一个加上两个子树的高度之和(在节点中测量)中最大。这考虑了最长的叶子到叶子路径包含在左子树中的可能性,包含在右子树中,或者通过根。在最后一种情况下,您不需要识别实际路径;子树高度告诉你它有多长(根节点+ 1)。
接收子树高度以处理第三个替代方案似乎是程序中参数s
的目的,但您不会使用它。
您的程序将为各种树返回错误的结果,其中
N
/
1
(直径1,但你的功能将返回2)
2
/ \
1 3
(直径3,但你的功能将返回2)
3
/ \
2 4
\
1
(直径4,但你的功能将返回3)
N
/ \
N 4
/ \
3 5
/ /
2 6
\ \
1 7
(直径7,但你的功能将返回5)
[在每个图中,测量树木直径的路径上的节点都被编号,所有其他节点都被指定为“N”。]
实际上,你的函数返回 height ,以节点计算,而不是直径。看起来在有利的情况下,它可能会记录s
的直径,但不能保持一致。