如果为每个节点找到树的直径,则给出父指针

时间:2013-08-19 16:08:16

标签: algorithm binary-tree

我在这里搜索过这个问题,但是对于二叉树的优化直径没有看到任何问题。

How do we find diameter of a binary tree if parent pointer to each node is given.

Definition of tree diameter is : Longest distance between two nodes of tree.
  

编辑::请使用父指针查找直径。我知道   使用递归找到直径,这是通过查找最大值来完成的   (左直径,右直径和树的高度)

节点结构如下 class Node { 节点离开; 节点权利; 节点parentPointer; int data;

}

3 个答案:

答案 0 :(得分:1)

来自geeksforgeeks的代码显示了如何计算O(n)中二进制时间的直径。

但是,不需要父指针,所以也许我误解了你的问题?

/*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));
}

答案 1 :(得分:0)

请说明父指针与直径有什么关系。如果将直径定义为任意两个节点之间的最大距离,则无关哪个节点是指定的父节点。另一方面,如果存在区别,例如父节点是源节点而其他节点是漏极,那么您可能正在寻找从任何节点到源的最大距离,而不是树的直径。

也就是说,您可以通过运行广度优先搜索(BFS)来解决这两个问题。如果您要查找距专用父运行BFS的距离,并使用距父项的距离标记每个节点。

另一方面,如果您正在寻找树木直径BFS两次:首先从您喜欢的任何节点开始并找到最远的;然后从最远的节点开始,找到离它最远的节点。碰巧的是,从“任何给定节点的最远节点”到“刚刚找到的最远节点”的距离给出了树的直径。

答案 2 :(得分:0)

http://leisurehours.wordpress.com/2009/07/18/find-the-diameter-of-a-tree/

假设我们被赋予指向树的任何节点的指针。

在给定节点上执行BFS(广度优先搜索)并找到与给定节点具有最大距离的节点。与给定节点具有最大距离的节点将是叶节点。让我们称之为node1 现在再次在node1上应用BFS,并找到node1中任何节点的最大距离。该距离是树的直径。因为node1是树的叶子,BFS找到从node1(叶子)到树中所有其他节点的最短距离。显然,距node1最远的节点将是一个叶子,因此我们将获得树的直径。