二叉树的直径

时间:2015-10-05 21:13:06

标签: c++ binary-tree

"树的直径(有时称为宽度)是树中任意两个节点之间最长路径上的节点数"。

下面的C ++函数是否适用于所有情况以查找二叉树的直径?称为rootint 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); } }

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的直径,但不能保持一致。