寻找树的直径

时间:2012-09-16 10:02:43

标签: c++ algorithm tree

我编写了用于查找二叉树直径的代码。但我无法弄清楚它出了什么问题。我写的两个函数及其定义如下: -

    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;   
    }
   }

我无法弄清楚我在哪里错了。有人能告诉我......

2 个答案:

答案 0 :(得分:1)

您想要返回最长路径上的节点数。因此,算法中存在的问题是这一行:

return max(lheight + rheight + 1,max(ldiameter,rdiameter));

其中

rootDiameter = lheight + rheight + 1

是从左树的最深节点到右树的最深节点的路径长度。但是,此计算不正确。单个节点返回高度0,因此不会计算。您有两种选择:

  1. 更改hieghtoftree以返回最深路径上的节点数而不是“跳数”
  2. 在求和中解决此问题
  3. 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));

结果将是路径上的边数。如果计算节点数,则根据需要在最终结果中加一或减一。